如何编写可重复的伪随机数生成器?

时间:2014-02-20 13:51:53

标签: c++ objective-c c random

例如:

如果rprng(seed,index)是我的功能,那么对于任何一对(seed,index),我应该始终为给定的(seed,index)获得相同的值。

例如:

rprng(4,2) = 17
rprng(4,5) = 21
rprng(4,2) = 17 

3 个答案:

答案 0 :(得分:2)

一个简单的想法是使用一个非常彻底的PRNG,seedseed+1seed+2 ...生成的值是可接受的。 E.g:

#include <random>

unsigned prng(unsigned seed, unsigned index)
{
  thread_local std::mt19937 engine;  // or a different engine
  engine.seed(seed + index);

  return engine();
}

同时检查此主题:https://mathoverflow.net/questions/104915/pseudo-random-algorithm-allowing-o1-computation-of-nth-element

答案 1 :(得分:1)

使用srand(seed),后面的myval = rand()的所有用法都是伪随机的。我经常使用这种方法,因为它是从任何给定种子获取相同值的最简单方法。

答案 2 :(得分:0)

int rprng(int seed, int index){
    srand(seed);
    while(index-- >0)
        rand();
    return rand();
}