如何使用伪随机数生成器生成一组特定的数字?

时间:2014-02-12 09:17:42

标签: c++ random numbers generator

我很沮丧,因为我不知道我尝试的是否可能。

假设我有一张无符号数字列表。 我想为某个伪随机数生成器算法创建种子,该算法可以生成该特定数字集。

创建种子时,我知道列表的长度以及最小/最大数字。

这是我当前生成数字的算法(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生成的数字

2 个答案:

答案 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;
}