C ++随机函数给出两次相同的整数作为输出

时间:2019-07-08 21:21:20

标签: c++ arrays random

我是C ++的新手,并且(伪)随机数存在一些问题。

该cpp文件应该提供3个数组。 1 [16]个浮点数组 2个[16]的整数数组(共32个)。

float数组不同于整数数组(按预期方式),但是我的整数数组完全相同...有人可以帮我解决这个问题吗?

PS。 它不会针对此问题输出任何错误消息 当我重新启动程序时,int Array会完全不同,但仍然是2个完全相同的副本...

代码:GenerateWorld.cpp

#include "GenerateWorld.h"
#include "CalculateBiomeBoundries.h"
#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
#include "write.h"
#include <random>
#include <ctime>



GenerateWorld::GenerateWorld()
{
}


GenerateWorld::~GenerateWorld()
{
}

bool GenerateWorld::generate() {

    exportData = "";
    createRand(1);
    createRand(2);
    createRand(3);

    std::cout << "DATA: " << exportData << std::endl;

    Write write;
    write.save("World12", "biomes", exportData);
    CalculateBiomeBoundries biome;
    biome.calculate("World12", exportData);


    return true;

}

void GenerateWorld::createRand(int type) {
    std::stringstream stream;
    std::default_random_engine randomGenerator(time(0));
    std::uniform_real_distribution<float> rf(-0.001f, 0.001f);
    std::uniform_int_distribution<int> ri(-10000, 10000);

    for (int i = 0; i < 16; i++) {
        if (type == 1) data[i] = rf(randomGenerator); //float
        else data[i] = ri(randomGenerator); //int

        stream << data[i];
        std::string s(stream.str());
        exportData += s;
        if (i != 15) exportData += ",";
        stream.str(std::string());
    }

    if(type != 3) exportData += "\n"; //if not the last one
    stream.str(std::string());
}

代码:GenerateWorld.h

#pragma once
#include <string>
class GenerateWorld
{
public:
    GenerateWorld();
    ~GenerateWorld();
    bool generate();

private:
    float data [200];
    std::string exportData;
    void createRand(int type);
};

输出:

DATA: -0.000774365,-7.83865e-05,-8.13702e-05,-0.000535194,-4.61116e-05,-0.000753322,0.000817172,-0.000967061,-0.000489403,-0.000969965,0.00026489,0.000407262,-0.000975306,-0.000866959,-6.6199e-05,-0.000780731
-6988,1037,-6061,3309,7252,1025,1222,3339,-5866,7040,5405,-8961,-1645,-107,-8060,3380
-6988,1037,-6061,3309,7252,1025,1222,3339,-5866,7040,5405,-8961,-1645,-107,-8060,3380

最后两行是完全相同的副本(相同的数组数据)。 我该如何解决?

我想要两个不同的(psuedo-)random int数组。 任何帮助都会很棒!

先谢谢您

1 个答案:

答案 0 :(得分:2)

您反复使用time(0)进行播种,std::default_random_engine randomGenerator(time(0)); 仅具有第二级粒度,因此,只要代码没有越过第二个边界,您就始终使用相同的值进行播种。

制作一次引擎,然后重复使用它,而不是一遍又一遍地播种。最简单的解决方案是更改:

static std::default_random_engine randomGenerator(time(0));

收件人:

std::random_device

一次初始化单个全局副本,然后重新使用它而无需重新播种。如果您不需要加密等级随机性,而只是“随机”的东西,那就很好。

更好的解决方案包括使用{{1}}来产生种子(尽管可悲的是,C ++标准并不要求使用加密随机性来实现它,因此,要想在行为上有任何保证,就很难正确,可移植地做到这一点,这令人惊讶地困难)