问题描述
我不明白为什么 srand() 在运行之间生成如此相似的随机数!
I don't understand why srand() generates so similar random numbers between runs!
我正在尝试运行以下代码
I am trying to run the following code
然而,我总是得到几乎相同的数字,而不是一个正确的随机数,随着时间的推移,这个数字增长缓慢.所以我得到的数字是:11669、11685、11701、11714、11731.
However instead of a proper random number I always end up with almost the same number, which is growing slowly as the time goes. So I get numbers like: 11669, 11685, 11701, 11714, 11731.
我做错了什么?
我使用的是 Visual Studio 2010 SP1.
I am using Visual Studio 2010 SP1.
好吧,srand() 真的那么简单吗?我的意思是怎么会有人称它为随机函数?
OK, is srand() really that simple? I mean how would anyone call it a random function?
推荐答案
一、srand()
不是随机函数;它设置了起点伪随机序列.有点令人惊讶的是,你的rand()
的实现似乎是返回一个基于之前的状态,而不是新计算的状态,所以第一个调用 srand()
后的值在很大程度上取决于传递给的值srand()
.如果你要写:
First, srand()
isn't a random function; it sets up the starting point
of a pseudo-random sequence. And somewhat surprisingly, your
implementation of rand()
seems to be returning a value based on the
previous state, and not on the newly calculated state, so that the first
value after a call to srand()
depends very much on the value passed to
srand()
. If you were to write:
,我相信你会看到更多的不同.
, I'm sure you'll see a lot more difference.
FWIW:我在 Windows 和 Linux 上都尝试了以下方法:
FWIW: I tried the following on both Windows and Linux:
以一秒为间隔调用 10 次,我得到:
Invoked 10 times at a one second interval, I got:
在 Windows 下使用 VC++—您会注意到第一次调用 rand()
—and
with VC++ under Windows—you'll note the very low variance of the
first call to rand()
—and
在Windows下使用g++;在这种情况下,即使读取的第一个值也是相对随机.
with g++ under Windows; in this case, even the first value read is relatively random.
如果你需要一个好的随机生成器,你可能不得不使用一个来自 Boost;该标准并没有说明什么算法应该是使用,并且实现的质量差异很大.
If you need a good random generator, you'll probably have to use one from Boost; the standard doesn't say much about what algorithm should be used, and implementations have varied enormously in quality.
这篇关于srand(time(NULL)) 产生类似的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!