我做了一本书的锻炼,上面写着编写生成psuedorandom数的程序。 我开始用简单。
#include "std_lib_facilities.h"
int randint()
{
int random = 0;
random = rand();
return random;
}
int main()
{
char input = 0;
cout << "Press any character and enter to generate a random number." << endl;
while (cin >> input)
cout << randint() << endl;
keep_window_open();
}
我注意到,每个程序运行时,会有相同的“随机”的输出。 所以,我看着随机数生成器,并决定这包括首先在randint尝试播种()。
srand(5355);
刚刚产生相同数量的一遍又一遍(我现在觉得愚蠢实现它。)
所以我想我会很聪明和实施这样的种子。
srand(rand());
这基本上只是做了作为程序首先没有,但输出的不同组数字(它有道理的,因为由兰特()生成所述第一数总是41)相同的
我能想到的唯一的事情,使这个更随机是:
- 让用户输入一个号码,设置为种子(这将是很容易实现,但这也是不得已而为之)OR
- 不知何故已经种子被设置为计算机时钟或一些其它不断变化的数量。
我在我头上,我现在应该停下来? 是选择2难以实现? 任何其他的想法?
提前致谢。
选项2并不难,在这里你去:
srand(time(NULL));
你需要包括stdlib.h
的srand()
和time.h
的time()
srand()函数只能使用一次:
int randint()
{
int random = rand();
return random;
}
int main()
{
// To get a unique sequence the random number generator should only be
// seeded once during the life of the application.
// As long as you don't try and start the application mulitple times a second
// you can use time() to get a ever changing seed point that only repeats every
// 60 or so years (assuming 32 bit clock).
srand(time(NULL));
// Comment the above line out if you need to debug with deterministic behavior.
char input = 0;
cout << "Press any character and enter to generate a random number." << endl;
while (cin >> input)
{
cout << randint() << endl;
}
keep_window_open();
}
问题是,如果你不播种发生器将种子本身0
(好像srand(0)
被称为)。 的PRNG的设计产生相同的种子序列相同(由于这样的事实,PNRGs不是真正随机的,它们是确定性算法,也许有点,因为它是用于测试非常有用)时。
当你想使用一个随机数种子它
srand(rand());
你在做的效果:
srand(0);
x = rand(); // x will always be the same.
srand(x);
如FigBug提到 ,使用播种发电机常用。
我认为这些文章的观点是,在实现该算法是在兰特()不是如何有效种子它一展身手。
产生的(伪)随机数是不平凡并且是值得研究生成它们的不同的技术。 我不认为单纯使用兰特()是作者的初衷是什么。