现在的位置: 首页 > 综合 > 正文

伪随机数产生原理及用法

2014年05月30日 ⁄ 综合 ⁄ 共 1878字 ⁄ 字号 评论关闭

一、
C++

中不能使用
random()

函数



random

函数不是
ANSI C

标准,不能在
gcc,vc

等编译器下编译通过。可改用
C++

下的
rand

函数来实现。

1


C++

标准函数库提供一随机数生成器
rand

,返回
0


RAND_MAX

之间均匀分布的伪随机整数。
RAND_MAX

必须至少为
32767


rand()

函数不接受参数,默认
seed


1

,程序调用一次后将改变。随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)

     
2



C++

中另一函数
srand

(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。

     
3





比较理想的是用变化的数,比如时间来作为随机数生成器的种子。
time

的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。

// C++

随机函数(
VC program



#include <stdio.h>

#include <iostream>

#include <time.h>

using namespace std;

#define MAX 100

int main(int argc, char* argv[])

{        
srand( (unsigned)time( NULL ) );//srand()


函数产生一个以当前时间开始的随机种子
.

应该放在
for

等循环语句前面


不然要很长时间等待

  
for (int i=0;i<10;i++)

  
cout<<rand()%MAX<<endl;//MAX

为最大值,其随机域为
0~MAX-1

  
return 0;

}

二、
rand()

的用法
  

     
rand()


不需要参数,它会返回一个从
0

到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。


这样,如果你要产生
0~10


10

个整数,可以表达为:

  
int N = rand() % 11;

     


这样,
N

的值就是一个
0~10

的随机数,如果要产生
1~10

,则是这样:

  
int N = 1 + rand() % 11;

  总结来说,可以表示为:

  
a + rand() % n

     


其中的
a

是起始值,
n

是整数的范围。
a + rand() % (b-a+1)

就表示a~b之间的一个随机数。

  若要
0~1

的小数,则可以先取得
0~10

的整数,然后均除以
10

即可得到随机到十分位的
10

个随机小数,若要得到随机到百分位的随机小数,则需要先得到
0~100


10

个整数,然后均除以
100

,其它情况依此类推。

另一种小数的产生方法。
  


rand() / double(RAND_MAX)

可以取得
0


1

之间的浮点数(注意,不同于整型时候的公式,是除以,不是求模),举例:

double ran_numf=0.0;
srand((unsigned)time(0));
for(int i=0;i<10;i++){  
ran_numf = rand() / (double)(RAND_MAX);
cout<<ran_numf<<" ";
}


运行结果为:
0.716636


0.457725





10


0


1

之间的浮点数,每次结果都不同。
  


如果想取更大范围的随机浮点数,比如
1


10

,可以将

rand() /(double)(RAND_MAX)


改为
rand() /(double)(RAND_MAX/10)


运行结果为:
7.19362


6.45775





10


1


10

之间的浮点数,每次结果都不同。



至于
100


1000

的情况,如此类推。

     


通常
rand()

产生的随机数在每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。若要产生每次不同的随机数,可以使用
srand( seed )

函数进行随机化,随着
seed

的不同,就能够产生不同的随机数。

     


如大家所说,还可以包含
time.h

头文件,然后使用
srand(time(0))

来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列
(

只要两次运行的间隔超过
1


)

 

 

 

参考资料:

《伪随机数
_

百度百科》
http://baike.baidu.com/view/1127.htm

C++中如何产生随机数
http://hi.baidu.com/skywind_21flying/blog/item/fd2cef62b3e68adce6113aa7.html

C++

中用
rand()


srand()

产生为随机数方法
http://hi.baidu.com/sdood/blog/item/4737297f573c8d0a28388a9c.html



抱歉!评论已关闭.