在C#中生成准随机数的最简单方法是什么?

时间:2009-06-25 14:39:27

标签: c# random

我想要的只是C#中的 实用 随机数生成器,所以我可以说例如

int dummyAge = MathHelpers.GetRandomNumber(20,70);

并且看起来像准随机,例如生成虚拟数据。

大多数stack overflow questions on this topic并在网络上进行关于真正随机性的哲学讨论,这不是我目前感兴趣的,例如很久以前我在 PHP 中做过一次,使用毫秒/睡眠这对虚拟数据来说很好,我只是想在 C#quick

有没有人根据一些时间种子等有一个快速的一半体面的C#随机数生成器,或者,我怎么能改变以下代码,以便它总是不生成相同的5连续数?

using System;

namespace TestRandom23874
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10));
            Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10));
            Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10));
            Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10));
            Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10));
            Console.ReadLine();
        }
    }

    public class MathHelpers
    {
        public static int GetRandomNumber(int min, int max)
        {
            Random random = new Random();
            return random.Next(min, max);
        }
    }
}

3 个答案:

答案 0 :(得分:13)

public class MathHelpers
    {
        private static Random random = new Random();
        public static int GetRandomNumber(int min, int max)
        {
            return random.Next(min, max);
        }
    }

这样,你不是每次都创建一个新的Random对象,而是重复使用同一个对象。当您足够快地重新创建一个新的时,它们将产生相同的结果。但是,如果您重复使用现有的,您将获得随机性。

答案 1 :(得分:2)

BFree的答案很好,但我认为值得一提的是一个稍微不同的模式 - 将Random实例传递给任何需要它的东西,而不是总是通过静态变量使用单个实例。后一种方法的缺点是Random不是线程安全的。您需要一些锁定或线程局部变量,或者避免使用多个线程开始。所以我会将问题中的原始代码调整为:

using System;

namespace TestRandom23874
{
    class Program
    {
        static void Main(string[] args)
        {
            Random rng = new Random();
            Console.WriteLine("the random number is: {0}", 
                MathHelpers.GetRandomNumber(rng, 1, 10));
            Console.WriteLine("the random number is: {0}", 
                MathHelpers.GetRandomNumber(rng, 1, 10));
            Console.WriteLine("the random number is: {0}", 
                MathHelpers.GetRandomNumber(rng, 1, 10));
            Console.WriteLine("the random number is: {0}", 
                MathHelpers.GetRandomNumber(rng, 1, 10));
            Console.WriteLine("the random number is: {0}", 
                MathHelpers.GetRandomNumber(rng, 1, 10));
        }
    }

    public class MathHelpers
    {
        public static int GetRandomNumber(Random random, int min, int max)
        {
            return random.Next(min, max);
        }
    }
}

这只是控制的基本反转,真的。您可能有一个静态RNG并且围绕它进行锁定,用于在您需要时以线程安全的方式生成Random的新实例(通过随机生成种子然后使用该实例)创建实例)然后在整个特定的单线程操作集中重用Random

答案 2 :(得分:1)

问题(5个相同的数字)是一个计时问题,BFree的答案解决了它。 Random类是使用计时器进行自播种,你的调用非常接近它们使用相同的种子。