我很沮丧,因为我不知道我尝试的是否可能。
假设我有一张无符号数字列表。 我想为某个伪随机数生成器算法创建种子,该算法可以生成该特定数字集。
创建种子时,我知道列表的长度以及最小/最大数字。
这是我当前生成数字的算法(C ++):
unsigned short rng(unsigned short lowerBounds, unsigned short upperBounds){
static unsigned short lim = (upperBounds - lowerBounds)+1;
static unsigned short a = 1; //SEED
a = a*2 % 32749;
return (a % lim)+lowerBounds;
}
例如,我会得到数字{63,37,82,34,75}
我需要有一个种子,可以在前5次运行中产生这些数字(顺序无关紧要)
简单来说,我想控制RNG生成的数字
答案 0 :(得分:1)
如果编译器支持C ++ 11,则可以使用std :: shuffle()。请参阅以下示例:
#include <algorithm> // std::move_backward
#include <array> // std::array
#include <random> // std::default_random_engine
#include <chrono> // std::chrono::system_clock
int main () {
// generate your own std::vector or std::array with your own data here
std::array<int,5> foo {63, 37, 82, 34, 75};
// obtain a time-based seed:
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
shuffle (foo.begin(), foo.end(), std::default_random_engine(seed));
for (int& i: foo) {
// put your function here
your_function(i);
}
return 0;
}
如果编译器不支持C ++ 11功能,则可以使用std::random_shuffle
。请参阅以下示例:
#include <algorithm> // std::random_shuffle
#include <vector> // std::vector
#include <ctime> // std::time
#include <cstdlib> // std::rand, std::srand
// random generator function:
int myrandom (int i) { return std::rand()%i;}
int main () {
std::srand ( unsigned ( std::time(0) ) );
std::vector<std::size_t> myvector;
// set your values in myvector somehow :)
myvector.push_back(63);
myvector.push_back(37);
myvector.push_back(82);
myvector.push_back(34);
myvector.push_back(75);
// using built-in random generator:
std::random_shuffle ( myvector.begin(), myvector.end() );
// using myrandom:
std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);
for (std::vector<std::size_t>::iterator it=myvector.begin(); it!=myvector.end(); ++it) {
// put your function here
your_function(*it);
}
return 0;
}
答案 1 :(得分:1)
代码
#include <random>
#include <iostream>
int f(int low, int high)
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(low, high);
return dis(gen);
}
std::uniform_int_distribution
会以这种方式为您提供一个随机数。如果知道你的种子和长度,这就是你做的事情
std::vector<int> f(int low, int high, unsigned seed, int len)
{
std::vector<int> ret; // RVO applies, no worries
std::mt19937 gen(seed);
std::uniform_int_distribution<> dis(low, high);
for (int i(0); i<len; ++i) {
ret.push_back(dis(gen));
}
return ret;
}