如何使用Mersenne Twister精确生成两个数字之间的所有值

时间:2017-01-09 20:37:55

标签: c++ algorithm random mersenne-twister

我想使用mt19937循环数组并从中获取每个值一次,但是以随机顺序。从本质上讲,有没有办法使用mt19937生成一个特定范围内的所有数字一次(不仅忽略重复,但确保它不会完全产生重复(为了提高效率))?

我考虑过洗牌功能,但它只是我关心的指数;数组中的值是任意的,但它们的相应索引很重要。我有一个1的矩阵,我需要随机选择一个索引并将其转换为0.但我不想进行超过必要的计算(完全与矩阵)。

2 个答案:

答案 0 :(得分:1)

假设您的数组大小为N,并且您不想重新排列它:

  1. 生成第二个数组,大小为N
  2. 使用Fisher-Yates-Knuth shuffle随机播放第二个数组。
  3. 按照第二个数组指定的顺序使用第一个数组的元素。
  4. Fisher-Yates-Knuth shuffle可以实现如下:

    //To shuffle an array a of n elements (indices 0..n-1):
    for i from 0 to n−2 do
      j ← random integer such that i ≤ j < n
      swap a[i] and a[j]
    

    您也可以使用std::shuffle

    std::shuffle(a.begin(), a.end(), std::default_random_engine(seed));
    

答案 1 :(得分:0)

所以你需要创建一个值列表,然后将它们洗牌。

虽然有一个随机播放的功能,但算法很简单。从索引0开始并使用0到N-1范围内的随机值进行交换,然后转到索引1并使用1到N-1范围内的随机值进行交换,依此类推,不要交换0到N-1,因为它没有提供真正随机的排列。