我是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数组。 任何帮助都会很棒!
先谢谢您
答案 0 :(得分:2)
您反复使用time(0)
进行播种,std::default_random_engine randomGenerator(time(0));
仅具有第二级粒度,因此,只要代码没有越过第二个边界,您就始终使用相同的值进行播种。
制作一次引擎,然后重复使用它,而不是一遍又一遍地播种。最简单的解决方案是更改:
static std::default_random_engine randomGenerator(time(0));
收件人:
std::random_device
一次初始化单个全局副本,然后重新使用它而无需重新播种。如果您不需要加密等级随机性,而只是“随机”的东西,那就很好。
更好的解决方案包括使用{{1}}来产生种子(尽管可悲的是,C ++标准并不要求使用加密随机性来实现它,因此,要想在行为上有任何保证,就很难正确,可移植地做到这一点,这令人惊讶地困难)