伪随机数产生原理及用法

一、 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

#include

#include

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< 为最大值,其随机域为 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< }
运行结果为: 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

你可能感兴趣的:(c/c++)