pos*_*sop 6 c++ random random-seed
我正在尝试为psudo-random数字生成器生成一个好的随机种子.我以为我会得到专家的意见.如果这是一种不好的方式,或者有更好的方法,请告诉我.
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <ctime>
unsigned int good_seed()
{
unsigned int random_seed, random_seed_a, random_seed_b;
std::ifstream file ("/dev/random", std::ios::binary);
if (file.is_open())
{
char * memblock;
int size = sizeof(int);
memblock = new char [size];
file.read (memblock, size);
file.close();
random_seed_a = int(memblock);
delete[] memblock;
}// end if
else
{
random_seed_a = 0;
}
random_seed_b = std::time(0);
random_seed = random_seed_a xor random_seed_b;
return random_seed;
} // end good_seed()
Run Code Online (Sandbox Code Playgroud)
从/ dev/random读取的代码似乎是错误的:你是C风格将你的字符缓冲区的地址转换为random_seed_a(这里为C++转换插件)并忽略你实际从/ dev/random读取的任何东西(试试*reinterpret_cast<int*>(memblock).
/ dev/random应该已经是一个很好的熵源,所以如果它可用,不要将该值与任何其他数据一起污染,只需将其直接用作种子即可.如果/ dev/random中没有足够的数据,我只会依赖于时间并单独使用它而不是用某些东西进行xor'ing.
好的伪随机数生成器不需要“好的”种子,任何种子(每次运行都不同)都同样有效。
直接使用系统时间很好(而且很常见)。使用起来/dev/random也还好。
如果您的伪随机数生成器不好,即使选择“好”种子也无济于事。如果可以的话更换它。
建议:梅森扭曲器非常受好评。这是一个甚至可以在最有限的系统上运行的先驱。
定义好。:-)
快速找到种子是否重要,或者种子尽可能随机(无论需要多长时间才能组合在一起)?
为了平衡 - 绝对不是最随机的,绝对不是最快的......
这将为您提供大部分随机的 160 位,即 10^50 左右的可变性。哈希值需要一瞬间才能运行,所以这不是闪电般的快,但对我来说过去是一个很好的平衡。