c ++为psudo随机数生成器生成一个好的随机种子

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)

Mar*_*k B 5

从/ dev/random读取的代码似乎是错误的:你是C风格将你的字符缓冲区的地址转换为random_seed_a(这里为C++转换插件)并忽略你实际从/ dev/random读取的任何东西(试试*reinterpret_cast<int*>(memblock).

/ dev/random应该已经是一个很好的熵源,所以如果它可用,不要将该值与任何其他数据一起污染,只需将其直接用作种子即可.如果/ dev/random中没有足够的数据,我只会依赖于时间并单独使用它而不是用某些东西进行xor'ing.

  • 根据我的研究,非确定性随机变量“dev/urandom”与不太随机变量 time(0) 的异或运算仍然是非确定性随机变量。 (2认同)

Jon*_*ric 5

好的伪随机数生成器不需要“好的”种子,任何种子(每次运行都不同)都同样有效。

直接使用系统时间很好(而且很常见)。使用起来/dev/random也还好。

如果您的伪随机数生成器不好,即使选择“好”种子也无济于事。如果可以的话更换它。

建议:梅森扭曲器非常受好评。这是一个甚至可以在最有限的系统上运行的先驱。

  • 根据目的,伪随机数生成器可能需要不可预测的种子。有一种在线扑克游戏将时间投入到可能是一个不错的 PRNG 中,这意味着可以通过观察一些牌来找出 PRNG 的开始位置,从而了解整个牌组。 (3认同)
  • 如果无法预测随机数序列对于用户来说“完全”很重要,那么您需要一个加密安全的生成器,而不是伪随机生成器。(如果你将真钱赌博建立在伪随机生成器的基础上,那你就疯了。) (3认同)

Dea*_*n J 0

定义好。:-)

快速找到种子是否重要,或者种子尽可能随机(无论需要多长时间才能组合在一起)?

为了平衡 - 绝对不是最随机的,绝对不是最快的......

  • 第一次调用时,获取系统时间(以毫秒为单位)。
  • 通过哈希函数(如 SHA-1)运行该函数。
  • 使用结果作为种子。

这将为您提供大部分随机的 160 位,即 10^50 左右的可变性。哈希值需要一瞬间才能运行,所以这不是闪电般的快,但对我来说过去是一个很好的平衡。

  • @DeanJ 哈希是多余的。直接用系统时间播种即可。您试图用哈希完成的事情是(一个好的)伪随机数生成器已经*做*(更好)的事情。 (3认同)