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

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

最佳答案

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/

相关文章:

java - 使用递归查找字符串中最长的回文

ruby-on-rails - 分页、随机搜索结果,不聚集

algorithm - 通过仅以相同顺序插入节点来从 Preorder 获得 BST

c# - 自定义授权属性

c# - 将带有 C 和 asm 代码的程序转换为 DLL

c# - Excel-DNA 将自定义数据保存到工作表(不是单元格)

python - 如何对不同的日期时间格式进行排序?

algorithm - 谷歌抓取索引算法

c# - 使用 linq 过滤分层列表

c# - Microsoft .net,值得吗?