在.NET中生成随机数而不使用任何内置函数

时间:2011-09-24 16:25:19

标签: c# .net vb.net random

我想知道每种编程语言中的随机函数是如何工作的,所以我想自己生成一个数字,即我不想使用任何内置的类或函数。

4 个答案:

答案 0 :(得分:4)

如果你好奇它是如何运作的,你可以从维基百科开始:Random number generationList of random number generators。第二个链接将为您提供一些您可以自己实现的流行算法(如Mersenne Twister)列表。

您还可以使用.Net Reflector反编译System.Random,并将给定的算法与.Net中原生实现的算法进行比较

另外,D. Knuth的Art of Computer Programming有一章关于随机数及其生成。

答案 1 :(得分:4)

为了简单和快速,很难击败Xorshift random number generator。它是否能产生良好的分布是另一个问题。

C#中的一个例子:http://www.codeproject.com/KB/cs/fastrandom.aspx

不同的语言和环境使用不同的随机数生成器。正如其他人所指出的,有很多方法可以生成伪随机数。

请参阅C# Normal Random Number和其他类似的Stack Overflow问题。

答案 2 :(得分:3)

正如其他人评论的那样,您真的希望依赖框架功能。如果这是出于学术目的或出于纯粹的兴趣,有许多RNG算法易于实现。一种是乘法携带(MWC)算法,可以在C#中轻松实现:

public class RNG
{
    // Seeds
    static uint m_w = 362436069;    /* must not be zero */
    static uint m_z = 521288629;    /* must not be zero */

    public int NextRandom()
    {
        m_z = 36969 * (m_z & 65535) + (m_z >> 16);
        m_w = 18000 * (m_w & 65535) + (m_w >> 16);
        return (int)((m_z << 16) + m_w);
    }
}

有关MWC的详细信息,请参阅http://www.bobwheeler.com/statistics/Password/MarsagliaPost.txt

答案 3 :(得分:0)

不使用Random()方法生成随机数

    using System;
    public class GenerateRandom
    {
        private int max;
        private int last;
        static void Main(string[] args)
        {
          GenerateRandom rand = new GenerateRandom(10);
             for (int i = 0; i < 25; i++)
             {
                 Console.WriteLine(rand.nextInt());
             }
        }
        // constructor that takes the max int
    public GenerateRandom(int max)
    {
        this.max = max;
        DateTime dt = DateTime.Now;//getting current DataTime
        int ms = dt.Millisecond;//getting date in millisecond
        last = (int) (ms % max);
    }

    // Note that the result can not be bigger then 32749
    public int nextInt()
    {
        last = (last * 32719 + 3) % 32749;//this value is set as per our requirement(i.e, these is not a static value
        return last % max;
    }
    }