C語言的隨機數產生可以通過random函數得到,設x=random() 那麽x就是壹個(0,1)的隨機變量。
再設壹個變量 p4 表示 4 出現的概率
初始化時可以令 p4=1/4
程序結構大致如此
a[]為結果序列
for (循環體根據妳需要的數的長度得到)
{
x=random();//得到壹個隨機數
若 0<x<p4 a[i]=4;
若 p4<x<p4+(1-p4)/3; a[i]=3;
若 p4+(1-p4)/3<x<p4+2*(1-p4)/3; a[i]=2;
若 p4+2*(1-p4)/3<x<p4+3*(1-p4)/3; a[i]=1;
if (a[i]=4) { p4=0;count=0;}
count=count+1;
if (count>16) { p4=(count-16)/4 } 保證16-20次必有壹個 4 出現,同時在16次以內決不會出現兩個4
}
如果妳需要matlab程序我可以很快給妳寫出來。
2 如果妳學過m序列就知道了,計算機的隨機數都是m序列的原理,好比均勻分布的隨機序列,如樓主所說,不加處理(1,2,3,4)出現的概率都是1/4,因此連續出現壹個數的概率N次的概率為(1/4)^N,只要N不管多大,都是可能的,但是概率會非常的小。
3 妳說的第三點是對的,其實計算機的隨機都是偽隨機序列,但是周期可以長到妳這輩子都不可能看完它循環完壹次。
/* HELLO.C -- Hello, world */
#include "stdio.h"
#include "conio.h"
# include "dos.h"
main()
{
int N,i,a[100],count;
float p4,x,dp;
struct time stime;
unsigned seed;
gettime(&stime);
seed=stime.ti_hund*stime.ti_min*stime.ti_hour;
srand(seed);
N=100;
p4=0.25;
count=17;
for(i=0;i<N;i++)
{
x=rand();
x=x/32768;
dp=(1-p4)/3;
if (x>=0 && x<=p4) a[i]=4;
if (x>p4 && x<=p4+dp) a[i]=3;
if (x>p4+dp && x<=p4+2*dp) a[i]=2;
if (x>p4+2*dp && x<=p4+3*dp) a[i]=1;
if (a[i]==4){p4=0;count=0;}
count=count+1;
if( count>16) {p4=(count-16); p4=p4/4;}
printf("%d ",a[i]);
}
getch();
}
srand(seed);根據系統時間初始化隨機,不然就會出現每次運行出相同的結果
上面是根據思路設計的C程序,結果可以調出來,
程序的運行結果生成壹百個隨機數,是 16 個間隔以內肯定只有壹個4,20個間隔以內又必有兩個4