我尝试使用以下公式实现减法滞后斐波那契随机数生成器: ??=(?[?−?] −?[?−?])???
但是有时它会生成负数。在互联网上搜索了几天之后,我的代码中找不到任何答案或错误。你们中的任何一个都可以帮助我了解我在做什么错吗?
class LaggedFibonaci_RNG : IRandomNUmberGenerator
{
private double[] initArray = null;
private int j = 1029;
private int k = 2281;
private int n = 0;
private double m = Math.Pow(2, 32);
private double Xn = DateTime.Now.Millisecond;
Random rand = new Random();
public LaggedFibonaci_RNG()
{
n = k;
initArray = new double[n];
// create initial array
for (int i = 0; i < initArray.Length; i++)
{
initArray[i] = rand.Next();
}
}
public double GenerateNextRandomNumber()
{
double randomNumber = 0;
//decrement j or set to optimal
if (j <= 1)
{
j = 1029;
}
else
{
j--;
}
// decrement k or set to optimal
if (k <= 1)
{
k = 2281;
}
else
{
k--;
}
//// apply the fibonacci formula
//randomNumber = (Xn * (n - j) - Xn * (n - k)) % m;
//// update the initial array at position n - k to hold the random number generated
//initArray[n - k] = randomNumber;
//Xn = randomNumber;
double firstElement = initArray[n - j];
double secondElement = initArray[n - k];
randomNumber = (firstElement - secondElement) % m;
initArray[n - k] = randomNumber;
//return the generated number
return randomNumber;
}
}
答案 0 :(得分:7)
此Wikipedia article on the modulo operation表明,关于如何定义模数和余数还没有完全一致。但是,取模操作取除数的符号更为常见,而 remainder 取值通常为红利。例如参见this math answer:
要找到 -b mod N ,只需将 N 添加到 -b ,直到数字介于 0 和 N 之间。
所以 -5 mod 3 是 1 ,而 -5 rem 3 是 -2 。>
牢记这个定义,C#的%
operator [language reference]是余数运算符,不是是 modulo 运算符。
鉴于m
是一个正数,我们可以利用余数来计算模运算。对于正的 m :
a mod m =(((a rem m)+ m) rem m
因此,我们可以在此处的公式中使用它,并将其写为:
randomNumber = (((firstElement - secondElement) % m) + m) % m;