如何用C语言产生0到1之间的随机数?

Python013

如何用C语言产生0到1之间的随机数?,第1张

方法一:

1、功能:

产生0到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)

}