我尝试使用以下公式实现减法滞后斐波那契随机数生成器:
= ([−] − [−])
但有时它会生成负数。在搜索了几天互联网后,我找不到任何答案或我的代码中的错误。你们谁能帮我理解我做错了什么?
但有时它会生成负数。在搜索了几天互联网后,我找不到任何答案或我的代码中的错误。你们谁能帮我理解我做错了什么?
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;
}
}
X[n-f]
始终大于X[n-k]
。我认为你需要使用mod
而不是rem
,所以应该是(((X[n-f] - X[n-k])%m)+m)%m
。 - Willem Van Onsemn
被重新赋值,还要将其初始化为0
? - Rufus Lmod
和rem
很容易混淆。mod
通常采用除数的符号,而不是被除数的符号。C#中的%
是一个余数操作,而不是模运算。 - Willem Van OnsemX[n-f] - X[n-k]
是正数,那么((X[n-f] - X[n-k]) % m + m) % m
将返回与您的代码相同的结果。但如果是负数,则会返回m
加上负数的结果。举个例子:((5 - 6) % 7 + 7) % 7 = 6
和((6 - 5) % 7 + 7) % 7 = 1
。 - Rufus L