方法一:
1、功能:
2、方法说明:
设m=216,产生产生0到1之间均匀分布的一个随机数的计算公式如下:
ri=mod(2053ri-1 +13849,m),i=1,2,3……
pi =ri/m
例:连续产生10个0到1之间均匀分布的一个随机数 。r的初值取5.0
#include "stdio.h"double rnd1(double *r)
{ int m
double s,u,v,p
s=65536.0 u=2053.0 v=13849.0
m=(int)(*r/s) *r=*r-m*s
*r=u*(*r)+v m=(int)(*r/s)
*r=*r-m*s p=*r/s
return(p)
}
main()
{ int i
double r
r=5.0
printf("\n")
for (i=0 i<=9 i++)
printf("%10.7lf\n",rnd1(&r))
printf("\n")
getch()
}
方法二:
float b=rand()/(RAND_MAX+1.0)
printf("%f\n",b)
注释:
stdlib.h头文件中有宏#define RAND_MAX 0x7fff
rand()产生一个0到0x7ffff即0到32767之间的随机数
rand()/(RAND_MAX+1.0)就等于一个0到1之间的小数了,因为rand()最大是32767最小是0,再除以32768就是一个0到1之间的小数(不能等于1),再乘以10就是一个0到10之间的数了(不等于10).最后再加1,就成了一个求1到10之间随机数的式子了.
#include<stdio.h>#include<time.h>
int main()
{
int i,r
int a=0,b=0//a,b分别用来统计产生0,1的个数。
for(i=0i<1000i++)
{
srand(1000*i*16807*time(NULL))//随机数的产生,如果只是用time(NULL)做种子的话会产生相同的随机数的。
r=rand()%2
if(r)
a++
else
b++
printf("%d\t",r)
}
printf("\n%d\t%d\t%f",a,b,(float)a/(a+b))
return 0
}
我觉得这种程序问题主要在于随机数的产生上面。这个程序0,1产生的还算是均匀的。
c语言函数名rand()简介
功
能::伪随机数发生器
所属库:stdlib.h
用
法:
需要先调用srand初始化,一般用当前日历时间初始化随机数种子,这样每次执行代码都可以产生不同的随机数。
函数原型:int
rand(void)
相关函数:srand、time、gettickcount
程序例
1:
#include
"stdio.h"
#include
"stdlib.h"
int
main(void)
{
int
i
printf("ten
random
numbers
from
0
to
99\n\n")
for(i=0
i<10
i++)
printf("%d\n",
rand()
%
100)
return
0
}
例1程序在每次运行时都会生成相同的十个伪随机数,如要每次生成的随机数不同应结合srand函数和time函数。
///////////////////
int
i,a
for(i=0i<3i++)
{
a=rand()%9
printf("%d",a)
}