問(wèn)題描述
我不明白為什么 srand() 在運(yùn)行之間生成如此相似的隨機(jī)數(shù)!
I don't understand why srand() generates so similar random numbers between runs!
我正在嘗試運(yùn)行以下代碼
I am trying to run the following code
srand ( time(NULL) );
int x = rand();
cout << x << endl;
然而,我總是得到幾乎相同的數(shù)字,而不是一個(gè)正確的隨機(jī)數(shù),隨著時(shí)間的推移,這個(gè)數(shù)字增長(zhǎng)緩慢.所以我得到的數(shù)字是: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.
我做錯(cuò)了什么?
我使用的是 Visual Studio 2010 SP1.
I am using Visual Studio 2010 SP1.
好吧,srand() 真的那么簡(jiǎn)單嗎?我的意思是怎么會(huì)有人稱它為隨機(jī)函數(shù)?
OK, is srand() really that simple? I mean how would anyone call it a random function?
srand(1) => rand() = 41
srand(2) => rand() = 45
srand(3) => rand() = 48
srand(4) => rand() = 51
....
推薦答案
一、srand()
不是隨機(jī)函數(shù);它設(shè)置了起點(diǎn)偽隨機(jī)序列.有點(diǎn)令人驚訝的是,你的rand()
的實(shí)現(xiàn)似乎是返回一個(gè)基于之前的狀態(tài),而不是新計(jì)算的狀態(tài),所以第一個(gè)調(diào)用 srand()
后的值在很大程度上取決于傳遞給的值srand()
.如果你要寫(xiě):
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:
srand( time( NULL ) );
rand();
std::cout << rand() << std::endl;
,我相信你會(huì)看到更多的不同.
, I'm sure you'll see a lot more difference.
FWIW:我在 Windows 和 Linux 上都嘗試了以下方法:
FWIW: I tried the following on both Windows and Linux:
int
main()
{
srand( time( NULL ) );
int r1 = rand();
std::cout << r1 << ' ' << rand() << std::endl;
return 0;
}
以一秒為間隔調(diào)用 10 次,我得到:
Invoked 10 times at a one second interval, I got:
16391 14979
16394 25727
16397 3708
16404 25205
16407 3185
16410 13933
16417 2662
16420 13411
16427 2139
在 Windows 下使用 VC++—您會(huì)注意到第一次調(diào)用 rand()
—and
with VC++ under Windows—you'll note the very low variance of the
first call to rand()
—and
1256800221 286343522
955907524 101665620
1731118607 991002476
1428701871 807009391
44395298 1688573463
817243457 1506183315
507034261 1310184381
1278902902 54648487
2049484769 942368151
1749966544 1833343137
在Windows下使用g++;在這種情況下,即使讀取的第一個(gè)值也是相對(duì)隨機(jī).
with g++ under Windows; in this case, even the first value read is relatively random.
如果你需要一個(gè)好的隨機(jī)生成器,你可能不得不使用一個(gè)來(lái)自 Boost;該標(biāo)準(zhǔn)并沒(méi)有說(shuō)明什么算法應(yīng)該是使用,并且實(shí)現(xiàn)的質(zhì)量差異很大.
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.
這篇關(guān)于srand(time(NULL)) 產(chǎn)生類似的結(jié)果的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!