gpt4 book ai didi

c# - 返回负数的斐波那契随机数生成器

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:05:58 25 4
gpt4 key购买 nike

我尝试使用以下公式实现减法滞后斐波那契随机数生成器:𝑿𝒏 = (𝑿[𝒏−𝒋] − 𝑿[𝒏−𝒌]) 𝐦𝐨𝐝 𝒎

但有时它会生成负数。在互联网上搜索了几天后,我在我的代码中找不到任何答案或错误。你们中的任何人都可以帮助我理解我做错了什么吗?

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 31,而 -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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com