【发布时间】:2011-04-25 12:32:49
【问题描述】:
我想生成一个随机的序列数组,这些序列重复并且每个数字只使用一次。例如,给定 0-9 的范围内有 2 个不同的种子,您可能会得到
Seed 1: 7 3 5 9 0 8 1 2 6 4 | 7 3 5 9 0 8 1 2 6 4 | 7 3 5 9 0 8 1 2 6 4
Seed 2: 2 5 7 1 4 9 6 8 3 0 | 2 5 7 1 4 9 6 8 3 0 | 2 5 7 1 4 9 6 8 3 0
据我了解,线性同余随机数生成器或 LCRNG 或 LCG 可以给我这个http://en.wikipedia.org/wiki/Linear_congruential_generator
知道 C# 中是否存在实现,或者我将如何开始编写一个。
Mersenne Twister 与 LCG 有何不同?
不确定我的所有问题都已得到解答,但这是我最终使用的。因为我将样本大小限制在从最大值到最小值的值范围内,所以我选择了一个不同的素数,只要给出相同的初始种子,它就会保持静态。我这样做是因为我想要相同的序列给定相同的种子和相同的最小/最大界限以实现测试的可重复性。
请批评我在这里所做的任何事情,这只是我一时想到的:
using System;
using System.Collections.Generic;
namespace FULLCYCLE
{
public class RandomNumber
{
private int _value;
private int _prime;
private static List<int> primes = new List<int>()
{
11,
23,
47,
97,
797,
1597,
6421,
25717,
51437,
102877,
411527,
823117,
1646237,
3292489,
6584983,
13169977,
26339969,
52679969,
105359939,
210719881,
421439783,
842879579,
1685759167
};
public RandomNumber( int seed )
{
_prime = primes[seed%primes.Count];
_value = seed;
}
public int Next( int min, int max )
{
int maxrate = (max-min+1);
if (_value > maxrate)
{
_value = _value % maxrate;
}
_value = (_value + _prime) % maxrate;
return _value + min;
}
}
}
【问题讨论】:
-
您链接的页面提供了您需要的信息。方程式就在页面上。