[转]C++/C中产生随机数(rand,srand用法)

参考原文地址:https://www.cnblogs.com/afarmer/archive/2011/05/01/2033715.html

  计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生的每个小序列都有一个初始值,即随机种子(即根据某一个初始值代入某个公式产生一系列值),注意:小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后,它们又会重复出现。

  我们知道rand()函数可以用来产生随机数,但这不是真正意义上的随机数,而是一个伪随机数,是根据一个数(我们称之为种子)为基准以某个递推公式算出来的一系列数,当这系列数很大时,就符合正态分布,从而相当于产生了随机数,但这不是真正意义上的数,当计算机正常开机后,这个种子的值是定了的,所以随机数也是定了的,除非你破坏了系统。

  1. rand()

    功能:随机数产生器;  用法:int rand(void);  头文件:stdlib.h

    rand()的内部实现是用线性同余法,它不是真的随机数,因其周期特别长,故在一定范围内可以看成是随机的。

    rand()返回一随机数值的范围在0~RAND_MAX之间。RAND_MAX的范围最少是在32676之间(int),unsigned int则为65535。0~RAND_MAX中每个数字·被选中的几率是相同的。

    当用户未设定随机数种子时,系统默认的随机数种子为1。因此rand()产生的是伪随机数字,每次执行是相同的“?此处有问题,不理解(每次执行的含义是什么)?”,通过运行程序验证发现,每一次执行程序会产生一系列随机数,但每一次运行产生的这一系列随机数是相同的;若要不同,应该用srand()来初始化。

  2. srand()

    功能:初始化随机数发生器 用法:void srand(unsigned int seed) 头文件:stdlib.h

    srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是一个整数。如果每次seed都设为相同值,rand()所产生的随机数值每次就会一样。若想使每次运行的的参数seed不一样,我们可以使用当前时钟作为种子,因为每次运行时间肯定不一样。

  • 2.1. 使用当前时钟作为随机数种子

    使用当前时钟,我们可以使用头文件ctime或time.h里面的time()函数

  1. 产生随机数的方法
  • a. 给srand()提供一个种子,它是一个unsigned int类型;
  • b. 调用rand(),它会根据提供给srand()的种子值返回一个随机数;
  • c. 根据需要多次调用rand(),从而不间断地得到新的随机数
  • d. 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果
  1. 测试代码
#include<iostream>
#include<cstdlib>
#include<ctime>
//#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
int main()
{
 //   srand((int)time(NULL));
    for(int i=0;i<10;i++)
        cout<<rand()<<‘ ‘;
        cout<<endl;
 //       for(int i=0;i<10;i++)
 //       cout<<random(1,100)<<‘ ‘;
    return 0;
}

结果:没有用srand()初始化每次运行都是下面那一系列数

srand()初始化

#include<iostream>
#include<cstdlib>
#include<ctime>
//#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
int main()
{
    srand((int)time(NULL));
    for(int i=0;i<10;i++)
        cout<<rand()<<‘ ‘;
        cout<<endl;
 //       for(int i=0;i<10;i++)
 //       cout<<random(1,100)<<‘ ‘;
    return 0;
}

结果:每次运行产生的一系列数都不同

  1. 产生一定范围内的随机数
  • a. [a,b): (rand()%(b-a))+a //取随机数对(b-a)取余(最大为b-a-1),再加上a,,即[a,b)
  • b. [a,b]: (rand()%(b-a+1))+a;
  • c. (a,b]: (rand()%(b-a))+a+1;
  • d. (a,b): (rand()%(b-a-1))+a+1;
  • d. 通用公式: a+rand()%n ,其中a是起始值,n是范围,注意对n取余最大值为n-1
  • e. 要取得0~1之间的浮点数,可以使用rand()/(double)RAND_MAX
#include<iostream>
#include<cstdlib>
#include<ctime>
#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
int main()
{
    srand((int)time(NULL));
    for(int i=0;i<10;i++)
        cout<<rand()<<‘ ‘;
        cout<<endl;
    for(int i=0;i<10;i++)
        cout<<random(1,100)<<‘ ‘;
    return 0;
}

结果:

以上

原文地址:https://www.cnblogs.com/qiulinzhang/p/9513673.html

时间: 2025-01-14 05:51:36

[转]C++/C中产生随机数(rand,srand用法)的相关文章

C/C++中产生随机数(rand,srand用法)

计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了.) 我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,

C++随机数rand(), srand()

c++产生随机数会用到rand(), srand()函数,下面总结两个函数特性和使用. 1. rand() #include <iostream> #include <cstdlib> using namespace std; int main() { int m; for(int i = 1; i <= 5; i++) { m = rand(); cout << "m = " << m << endl; } retur

matlab 中randn randi rand 的用法以及区别

1,rand 生成均匀分布的伪随机数.分布在(0~1)之间 主要语法:rand(m,n)生成m行n列的均匀分布的伪随机数                      rand(m,n,'double')生成指定精度的均匀分布的伪随机数,参数还可以 是'single'                     rand(RandStream,m,n)利用指定的RandStream(我理解为随机种子)生成伪 随机数 2,randn 生成标准正态分布的伪随机数(均值为0,方差为1)     主要语法:和上

C/C++随机数rand()和种子函数srand()

在计算机编程中,常常要产生一个随机数.但是要让计算机产生一个随机数并不那么容易.计算机的执行,是以代码来进行的,所以并不可能像抽牌,扔骰子那样产生一个真正具有随机意义的数.只可能以一定的算法产生一个伪随机数,C/C++提供了一个函数,放在cstdlib中,叫做rand(),原型为:int rand(void);. 显然,这个函数不接受任何参数,它的作用是:产生一个[0..RAND_MAX]之间的随机数.RAND_MAX也存放在cstdlib中,是一个宏常量: #define RAND_MAX O

【编程开发】C语言中随机数rand使用注意事项

[编程开发]C语言中随机数rand使用注意事项 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语言中的rand函数为例,使用时需要注意随机数的随机体现在哪里,比如是程序在不同的时刻执行时,相同位置的随机数是否需要一样,还是要每次执行生成的随机数也要不一样,等等,这些都是需要加以关注的地方. 经测试,发现,在不使用srand这个随机数种子的情况下:每次运行生成的随机数都是一样的.有的时候是需要这样子的,当然可以直接使

C++中的随机数函数(

标签:ul 随机数 c 整数 max 教育  C++中产生随机数种子对于刚開始学习的人一直都非常困惑.大家知道,在C中有专门的srand(N)函数能够轻松实现这一功能,然而在C++中则要复杂一些.以下是笔者学习的一点心得,希望对大家能有所帮助.(这里我们依旧要借助C标准库中的rand()函数) 函数说明: int rand();                                          :返回从[0,MAX)之间的随机整数,这里的MAX与你所定义的数据类型而定:需#inc

rand(),srand()区别

先从随机数的原理谈起. 计算机的随机数都是由伪随机数,即是由小M多项式序列生成.产生每个小序列都有一个初始值,即随机种子. srand()产生随机种子. rand()产生随机数 要保证计算机产生不相同的随机数,应保证它们的随机种子是不一样的. srand( (unsigned)time( NULL ) ); 就是以时间做为随机种子,因为每次你运行的时间总是不一样的. 补充一点是小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,即你取得65535个随机数后它们

【转】随机函数的rand、srand用法

from:深海的小鱼儿 地址:http://www.cnblogs.com/xmphoenix/archive/2011/04/07/2008622.html 随机函数的rand.srand用法 一>基础 我们知道rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是 根据一个数,我们可以称它为种了,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正 的随机数,当计算机正常开机后,这个种子的值是定了的,除

LoadRunner中的随机数

LoadRunner中的随机数 Action() { int i; char OrderId[21]; srand(time(NULL)); i=rand()%10; lr_save_datetime("%m%d%H%M%S", DATE_NOW, "now"); sprintf(OrderId, "%s%d", lr_eval_string("{now}"),i); lr_output_message("定单号为: