C++ 在c+中生成超级随机数+;

C++ 在c+中生成超级随机数+;,c++,c++11,random,vector,random-seed,C++,C++11,Random,Vector,Random Seed,C++11引入了允许生成非常随机数的类,它还创建了随机数的均匀分布。还可以实现生成种子(用于使随机数生成器更随机的数字) 我试图做一个函数,生成一个最小值和最大值之间的随机数,但我遇到了麻烦。该函数只生成一次种子和随机数。换句话说,当我调用这个函数时,它会一直给我相同的号码 下面是代码,我尝试生成一堆种子,随机选取其中一个,将该种子用于RNG,最后生成一个随机数 int Utils::GenerateSuperRandomNum(int min, int max) { //Seed a

C++11引入了允许生成非常随机数的类,它还创建了随机数的均匀分布。还可以实现生成种子(用于使随机数生成器更随机的数字)

我试图做一个函数,生成一个最小值和最大值之间的随机数,但我遇到了麻烦。该函数只生成一次种子和随机数。换句话说,当我调用这个函数时,它会一直给我相同的号码

下面是代码,我尝试生成一堆种子,随机选取其中一个,将该种子用于RNG,最后生成一个随机数

int Utils::GenerateSuperRandomNum(int min, int max)
{
    //Seed a the RNG
    int randNum;
    int randIndex;
    seed_seq seq{ 1, 2, 3, 4, 5 };
    vector<int> seeds(5 * max);
    uniform_int_distribution<int> rngDistribution(min, max);    //Generates number in the range min to max.

    //Generate our seed numbers.
    seq.generate(seeds.begin(), seeds.end());

    //Generate random index bewteen 0 and size - 1.
    srand(seeds.at(0));
    randIndex = rand() % seeds.size(); 

    //Seed the RNG with a random seed from our vector.
    mt19937 rngGenerator(seeds.at(randIndex)); 

    //Get a random number.
    randNum = rngDistribution(rngGenerator);

    return randNum;
}
int-Utils::GenerateSuperRandomNum(int-min,int-max)
{
//在RNG中添加种子a
int-randNum;
国际贸易指数;
种子{1,2,3,4,5};
载体种子(最多5个);
均匀分布rngDistribution(min,max);//生成最小到最大范围内的数字。
//生成我们的种子编号。
seq.generate(seeds.begin(),seeds.end());
//生成0和大小为-1的随机索引。
srand(seeds.at(0));
randIndex=rand()%seeds.size();
//使用向量中的随机种子为RNG播种。
mt19937 RNG发电机(种子at(随机指数));
//得到一个随机数。
randNum=RNG分布(RNG发电机);
返回randNum;
}
种子不会使(伪)随机数生成器变得更随机。它为生成可复制的随机数序列提供了一个起点


这意味着,如果你提供完全相同的种子,你将得到完全相同的结果。

通过使用随机数生成器生成自己的种子,使随机数生成器更“随机”,这有点像是试图通过拉鞋带来提升自己。如果这只是为了好玩,时间是一个足够随机的种子,如果你正在做超级间谍加密一个h/w设备,提供真正的随机事件是你需要的

你可以尝试使用这项服务,我不知道它是否有效,或者只是国家安全局试图欺骗你

由于
srand
每次都以相同的值作为种子,因此每次都以相同的状态开始。因为它每次都接收相同的值,所以它总是以相同的状态开始。与
rand
使用的状态相同

randIndex = rand() % seeds.size(); 
由于
rand
始终具有与
srand
相同的状态,因此每次都会生成相同的第一个数字

 mt19937 rngGenerator(seeds.at(randIndex)); 
由于
randIndex
总是相同的值,因此
seeds.at(randIndex)
总是相同的值。由于
rngGenerator
始终使用相同的值作为种子,因此它始终具有相同的状态

randNum = rngDistribution(rngGenerator);
由于
rngDistribution
始终具有相同的状态,因此它始终生成相同的值

//Generate random index bewteen 0 and size - 1.
srand(seeds.at(0));
这显然是个问题。简单的解决方法是根据CPU温度、时间或其他经常变化的值进行种子设定。
基本上,你已经严重地过度考虑了这一点。它的设计用途如下:

int Utils::GenerateSuperRandomNum(int min, int max) {
    static mt19937 rngGenerator(std::random_device{}());
    std::uniform_int_distribution<int> rngDistribution(min, max);
    return rngDistribution(rngGenerator);
}
int-Utils::GenerateSuperRandomNum(int-min,int-max){
静态mt19937 RNG发生器(std::random_设备{}());
标准:均匀分布(最小值、最大值);
返回RNG分配(RNG发电机);
}
std::random_device{}()
根据神奇的硬件生成一个模糊的随机数,比如CPU温度之类的。它可能很慢或者有其他问题,所以每个程序只能使用一次。即,为更快/更好的发电机播种

静态mt19937发电机(
创建一个全局生成器,在第一次调用函数时对其进行种子设定,以后再也不会进行种子设定。这很完美,因为我们希望它初始化一次,然后从那时起就开始执行它的神奇操作。其他生成器如
rand
的使用不会增加任何熵,所以不要这样做。我们也不想重新设定-为它设定种子,因为这可能会意外地减少随机性,而不是增加随机性


std::统一内部分布rngDistribution(最小值、最大值);
rngDistribution(rngGenerator)
您似乎理解。他们使用生成器在该分布中给出随机数。完成交易。

如果您继续使用相同的种子为随机生成器重新播种,您将继续得到相同的结果。原因是什么?顺便说一句,您的函数takes不会读取除您提供的两个参数之外的任何外部变量…因此输入完整请确定输出您应该使用
std::random_device
创建种子。有关此代码的实际外观示例,请参阅…仅供参考,
rand()%seeds.size()
通常不会(均匀地)随机生成数字。要添加到我前面的注释中,
seq.generate(seeds.begin(),seeds.end());
将始终生成相同的序列,因此
种子。在(0)
将始终返回相同的值,因此
srand
将始终接收相同的值。同样地,
randIndex
将始终具有相同的值。两个相同的生成器实例使用相同的数字播种,将在其生命周期内产生相同的结果系列。我只是想解释一下为什么您的解决方案不起作用。请参阅@Mooing Duck's Response以获得更好的解决方案。OP基本上实现了@Schighshagh Mory truth的一个复杂版本。因为你使用相同的种子,你将生成相同的数字。非常简单。@Katianie:如果你对他们大喊大叫并侮辱他们,人们不会愿意帮助你。(我猜是“neckbeard”)是一种侮辱。)@Katianie任何PRNG都会生成新号码,前提是您在每次通话中不使用相同的种子进行重新播种。我没有侮辱;我简短地解释了它不起作用的原因。您拒绝倾听。@Katianie,新号码不是“更随机的”要计算随机性,需要计算源的熵。在这种情况下,RNG是伪随机的,即熵为0,因此
int Utils::GenerateSuperRandomNum(int min, int max) {
    static mt19937 rngGenerator(std::random_device{}());
    std::uniform_int_distribution<int> rngDistribution(min, max);
    return rngDistribution(rngGenerator);
}