我尝试使用以下公式实现减法滞后斐波那契随机数生成器: 𝑿𝒏 = (𝑿[𝒏−𝒋] − 𝑿[𝒏−𝒌]) 𝐦𝐨𝐝 𝒎
但有时它会生成负数。在互联网上搜索了几天后,我在我的代码中找不到任何答案或错误。你们中的任何人都可以帮助我理解我做错了什么吗?
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;
}
}
最佳答案
这Wikipedia article on the modulo operation表明对于如何定义模和余数没有完全一致。然而,取模运算更常见的是取除数的符号,而余数通常取的值股息。参见示例 this math answer :
To find −b mod N, just keep adding N to -b until the number is between 0 and N.
所以 -5 mod 3 是 1,而 -5 rem 3 是 -2。 p>
考虑到这个定义,C# 的 %
operator [language reference] , 是一个余数运算符,不是一个模数运算符。
鉴于 m
是一个正数,我们可以利用余数来计算模运算。对于正的 m:
a mod m = ((a rem m)+m) rem m
因此,我们可以在此处的公式中使用它,并将其编写为:
randomNumber = <b>((</b>(firstElement - secondElement) % m) <b>+ m) % m</b>;
关于c# - 返回负数的斐波那契随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57716104/