我有一个程序使用boost :: random的mt19937随机数生成器.我需要做一个random_shuffle,并希望为此生成的随机数来自这个共享状态,这样它们就可以确定为mersenne twister之前生成的数字.
我试过这样的事情:
void foo(std::vector<unsigned> &vec, boost::mt19937 &state)
{
struct bar {
boost::mt19937 &_state;
unsigned operator()(unsigned i) {
boost::uniform_int<> rng(0, i - 1);
return rng(_state);
}
bar(boost::mt19937 &state) : _state(state) {}
} rand(state);
std::random_shuffle(vec.begin(), vec.end(), rand);
}
Run Code Online (Sandbox Code Playgroud)
但是我得到一个模板错误,用rand调用random_shuffle.但是这有效:
unsigned bar(unsigned i)
{
boost::mt19937 no_state;
boost::uniform_int<> rng(0, i - 1);
return rng(no_state);
}
void foo(std::vector<unsigned> &vec, boost::mt19937 &state)
{
std::random_shuffle(vec.begin(), vec.end(), bar);
}
Run Code Online (Sandbox Code Playgroud)
可能是因为它是一个实际的函数调用.但显然这并没有使国家不受最初的mersenne twister影响.是什么赋予了?有没有办法在没有全局变量的情况下做我想做的事情?
在函数中,我想生成范围内的数字列表:(在执行程序时,此函数仅被调用一次.)
void DataSet::finalize(double trainPercent, bool genValidData)
{
srand(time(0));
printf("%d\n", rand());
// indices = {0, 1, 2, 3, 4, ..., m_train.size()-1}
vector<size_t> indices(m_train.size());
for (size_t i = 0; i < indices.size(); i++)
indices[i] = i;
random_shuffle(indices.begin(), indices.end());
// Output
for (size_t i = 0; i < 10; i++)
printf("%ld ", indices[i]);
puts("");
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
850577673
246 239 7 102 41 201 288 23 1 237
Run Code Online (Sandbox Code Playgroud)
几秒钟后:
856981140
246 239 7 102 41 201 288 23 1 237
Run Code Online (Sandbox Code Playgroud)
和更多:
857552578
246 239 …Run Code Online (Sandbox Code Playgroud) 我有一个std :: vector,我需要随机播放.它只有大约20名成员.每次运行程序时,它还需要产生不同的shuffle.
现在我正在使用random_shuffle,但是每次运行程序时它都会给出相同的结果.我试过srand(unsigned(time(NULL)));在这个帖子中提出的,但是,这在我的平台上不起作用.
如果可能,我想只使用标准代码.
编辑:这是我的实现:
vector<Tile>gameTiles;
gameTiles.push_back(Tile(0,0));
gameTiles.push_back(Tile(0,1));
gameTiles.push_back(Tile(0,2));
gameTiles.push_back(Tile(0,3));
gameTiles.push_back(Tile(0,4));
//etc. ~20 member
random_shuffle(gameTiles.begin(), gameTiles.end());
Run Code Online (Sandbox Code Playgroud) 我要带一个格式化的文本文件,并将不同的行放在随机位置的数组中。但是,当我尝试获取时rand() % 8,我会获得以前的值。这使我丢失了一些行,并使数组的某些部分留空。
我应该如何修改它,以便以随机顺序获得从0到7的唯一值?我只使用我在课堂上学到的东西,导师不推荐新东西。请帮助我更改此代码的逻辑。
void get_input(string (&teams)[8][6]) {
srand(time(NULL));
string filename;
double value;
char buffer[100];
int diffnum[8];
string token;
cout << "Enter the input file: ";
cin >> filename;
ifstream infile;
infile.open (filename.c_str());
if (infile.is_open()) {
int teamcounter = 0;
while (infile.getline (buffer, 100) && teamcounter < 8) {
int ran = rand()%8;
for (int find = 0; find < 8; find++) {
while (diffnum[find] == ran) {
ran = rand()%8;
}
}
diffnum[teamcounter] = ran;
int counter …Run Code Online (Sandbox Code Playgroud) 我有一个 C++ 向量,它已排序数据,我想以随机顺序访问数据以对数据进行洗牌。rand 的问题是可以同时访问两个索引,并且当最后一项保留时,将会有很多不需要的查找。有什么建议。
我编写了以下代码来生成某些数字{0,1,2,...,31}的随机序列.它工作正常,但不能保证在任何有限的时间内完成; 在任何间隔之后,仍然只有一定(非常高)的概率将完成.有关删除此问题的任何建议吗?
int th;
vector<int> V2 = vector<int> (32,0);
for (int k=0;k<32;k++){
do{
th = rand() % 32;
} while ( V2[th] == 0 );
V2[th] = k;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试生成一小段(约20个)不同/唯一的随机数.
这就是我现在拥有的:
unique_random.h:
#ifndef UNIQUE_RANDOM_H
#define UNIQUE_RANDOM_H
// generates a pseudo-random number in [min, max]
int random_number (unsigned int min, unsigned int max) {
static bool seed_initialized = false;
if (!seed_initialized) {
seed_initialized = true;
srand((unsigned int) time(NULL));
}
return rand() % (max - min + 1) + min;
}
// generates a random number different from the previously generated
int random_number_without_these (int min, int max, std::set<int>& generated) {
int res = random_number (min, max);
// if res one …Run Code Online (Sandbox Code Playgroud)