为什么种子一样,用rand()产生的随机数就会一样?

时间:2021-04-20 10:49:06
为什么是这样呢?
为c写标准的人不会注意不到这个,还有什么道理在里面吗?

17 个解决方案

#1


加上这个
#include <time.h>
srand(time(NULL));

#2


 rand() 产生的是伪随机数 ,条件(种子)一样,结果是可以重复的。 这个和真实世界里抛硬币不一样,抛硬币即使条件完全一样,结果也是不能重复的

#3


因为那是伪随机数, 是通过算法得出来的。 算法已经定死了, 起始值一样, 结果当然就一样啦。
如果想引入真正的随机值, 就需要和硬件或者操作系统打交道, 那么就超出c++语言本身的范畴同时失去可移植性了, 所以c++的标准化组织不愿意采用。

#4


C语言里不能调用真正随机数吗?
我看完基础教程好像没提到这个。

#5


所谓随机数只不过是一个数列,种子是指从哪一个位置开始的。

另外,真正随机数只存在有理论上的

#6


带有真正意味的随机数,电脑中也是可以产生的,
比如说硬件软件的异常,中断时间啦什么的,不过随机数实在是个相当复杂的问题, 没有必要还是不要费精力琢磨了 

#7


看来我要认真研究一下

#8


任何软件产生的随机数都不是真随机数,因为软件只能按照某种规律生产数字,

#9


rand()是其实是伪随机。具体的实现思路是这样:定义了一个很大的随机串,例如:
[1][2][3][4][5][6][7][8][9][0][9][8][7][6][5][4][3][2][1]...
而种子的含义其实是指定rand()从这个随机串的哪个位置开始读,比如用2作为种子,你调用rand()得到的就是2, 再调用就是3, 依此类推。

当然,真正的随机串比上面的例子复杂多了,但是实现思路是一样的。
如果不用srand()指定种子, 每次其实都是从随机串开始取随机数,所以得到一样的随机数。
一般的,都是使用srand(time(NULL));把时间作为种子。

#10


种子一样,用rand()产生的随机数就会一样?
这是因为C采用的随机数算法生成的是一个随机数数列。采用的是固定的算化,初始值相同,结果当然相同。

#11


今天到图书馆翻了一下,得出以下结论:
1)用程序只能得到伪随机数。很显然,任何程序的结果都是可预测的,既然可预测,就不是随机的。
2)产生随机数的大致思路是:先给定一个初值(种子),然后由这个初值出发用一定的算法得到一个或一列数,即随机数。
   得到的随机数的随机性的好坏与所用的算法有直接的关系。
3)不是c标准委员会没有注意到,他们也是没有办法,呵呵。

以上是小弟的看法,望各位大哥指正。

#12


电脑当然可以产生真正意味的随机数, 只是那是相当麻烦且没有移植性的。
比如说, 可以利用寻页异常出现的频率啦, 接受到的网卡中断的次数啦, 内存总线仲裁的次数啦, cpu遇到偶然性异常的时间啦, 硬件设备出现完全随机性的事件啦, 都可以成为生成随机数的参考。

当然上面提到的很多是不能用来作随机数的, 因为有被黑客利用的可能。

#13


12楼所说的随机源,都是寻找种子的方法,不是么?这和srand没有本质的区别。

#14


本质上的区别? 什么是本质上的区别?

如果世界上的万物真的是符合逻辑的, 那么背后一定有规律, 所以宇宙中没有真正的随机数存在的, 只有一些人类尚未了解的隐参数而已, 除非上帝是靠掷色子来创造世界的。

当然这只是爱因斯坦的理论,薛定谔对此有不同的看法。

随机数真的是相当复杂的话题, 越扯越远了。

#15


学习了,原来随机数是这么得到的呀。

#16


RandomNumber.h
#ifndef RANDOM_NUMBER
#define RANDOM_NUMBER
const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;

class RandomNumber
{
private:
unsigned long randSeed;
public:
RandomNumber(unsigned long s = 0);
unsigned short Random(unsigned long n);
double fRandom(void);
};
#endif

RandomNumber.cpp
#include "RandomNumber.h"
#include <time.h>
RandomNumber::RandomNumber(unsigned long s)
{
time_t t;
t = time(NULL);
tm *p = localtime(&t);
if(s == 0)
randSeed = (p->tm_hour * 60 + p->tm_min) * 60 + p->tm_sec;
else
randSeed = s;
}

unsigned short RandomNumber::Random(unsigned long n)
{
randSeed = multiplier * randSeed + adder;
return (unsigned short)((randSeed >> 16) % n);
}

double RandomNumber::fRandom()
{
return Random(maxshort)/double(maxshort);
}


#17


谢谢大家捧场,这个问题本来就是仁者见仁,智者见智,在于个人的理解。
最最重要的是大家凡事都应深思才是。

#1


加上这个
#include <time.h>
srand(time(NULL));

#2


 rand() 产生的是伪随机数 ,条件(种子)一样,结果是可以重复的。 这个和真实世界里抛硬币不一样,抛硬币即使条件完全一样,结果也是不能重复的

#3


因为那是伪随机数, 是通过算法得出来的。 算法已经定死了, 起始值一样, 结果当然就一样啦。
如果想引入真正的随机值, 就需要和硬件或者操作系统打交道, 那么就超出c++语言本身的范畴同时失去可移植性了, 所以c++的标准化组织不愿意采用。

#4


C语言里不能调用真正随机数吗?
我看完基础教程好像没提到这个。

#5


所谓随机数只不过是一个数列,种子是指从哪一个位置开始的。

另外,真正随机数只存在有理论上的

#6


带有真正意味的随机数,电脑中也是可以产生的,
比如说硬件软件的异常,中断时间啦什么的,不过随机数实在是个相当复杂的问题, 没有必要还是不要费精力琢磨了 

#7


看来我要认真研究一下

#8


任何软件产生的随机数都不是真随机数,因为软件只能按照某种规律生产数字,

#9


rand()是其实是伪随机。具体的实现思路是这样:定义了一个很大的随机串,例如:
[1][2][3][4][5][6][7][8][9][0][9][8][7][6][5][4][3][2][1]...
而种子的含义其实是指定rand()从这个随机串的哪个位置开始读,比如用2作为种子,你调用rand()得到的就是2, 再调用就是3, 依此类推。

当然,真正的随机串比上面的例子复杂多了,但是实现思路是一样的。
如果不用srand()指定种子, 每次其实都是从随机串开始取随机数,所以得到一样的随机数。
一般的,都是使用srand(time(NULL));把时间作为种子。

#10


种子一样,用rand()产生的随机数就会一样?
这是因为C采用的随机数算法生成的是一个随机数数列。采用的是固定的算化,初始值相同,结果当然相同。

#11


今天到图书馆翻了一下,得出以下结论:
1)用程序只能得到伪随机数。很显然,任何程序的结果都是可预测的,既然可预测,就不是随机的。
2)产生随机数的大致思路是:先给定一个初值(种子),然后由这个初值出发用一定的算法得到一个或一列数,即随机数。
   得到的随机数的随机性的好坏与所用的算法有直接的关系。
3)不是c标准委员会没有注意到,他们也是没有办法,呵呵。

以上是小弟的看法,望各位大哥指正。

#12


电脑当然可以产生真正意味的随机数, 只是那是相当麻烦且没有移植性的。
比如说, 可以利用寻页异常出现的频率啦, 接受到的网卡中断的次数啦, 内存总线仲裁的次数啦, cpu遇到偶然性异常的时间啦, 硬件设备出现完全随机性的事件啦, 都可以成为生成随机数的参考。

当然上面提到的很多是不能用来作随机数的, 因为有被黑客利用的可能。

#13


12楼所说的随机源,都是寻找种子的方法,不是么?这和srand没有本质的区别。

#14


本质上的区别? 什么是本质上的区别?

如果世界上的万物真的是符合逻辑的, 那么背后一定有规律, 所以宇宙中没有真正的随机数存在的, 只有一些人类尚未了解的隐参数而已, 除非上帝是靠掷色子来创造世界的。

当然这只是爱因斯坦的理论,薛定谔对此有不同的看法。

随机数真的是相当复杂的话题, 越扯越远了。

#15


学习了,原来随机数是这么得到的呀。

#16


RandomNumber.h
#ifndef RANDOM_NUMBER
#define RANDOM_NUMBER
const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;

class RandomNumber
{
private:
unsigned long randSeed;
public:
RandomNumber(unsigned long s = 0);
unsigned short Random(unsigned long n);
double fRandom(void);
};
#endif

RandomNumber.cpp
#include "RandomNumber.h"
#include <time.h>
RandomNumber::RandomNumber(unsigned long s)
{
time_t t;
t = time(NULL);
tm *p = localtime(&t);
if(s == 0)
randSeed = (p->tm_hour * 60 + p->tm_min) * 60 + p->tm_sec;
else
randSeed = s;
}

unsigned short RandomNumber::Random(unsigned long n)
{
randSeed = multiplier * randSeed + adder;
return (unsigned short)((randSeed >> 16) % n);
}

double RandomNumber::fRandom()
{
return Random(maxshort)/double(maxshort);
}


#17


谢谢大家捧场,这个问题本来就是仁者见仁,智者见智,在于个人的理解。
最最重要的是大家凡事都应深思才是。