斐波那契随机数生成器返回负数

时间:2019-08-29 18:38:30

标签: c# algorithm

我尝试使用以下公式实现减法滞后斐波那契随机数生成器: ??=(?[?−?] −?[?−?])???

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

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;
    }
}

1 个答案:

答案 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;