2个双数之间的随机数

时间:2009-06-30 17:17:55

标签: c# random

是否可以在2个双打之间生成一个随机数?

示例:

public double GetRandomeNumber(double minimum, double maximum)
{
    return Random.NextDouble(minimum, maximum) 
}

然后我用以下内容称呼它:

double result = GetRandomNumber(1.23, 5.34);

任何想法都会受到赞赏。

11 个答案:

答案 0 :(得分:289)

Random.NextDouble返回介于0和1之间的双精度。然后将其乘以您需要进入的范围(最大值和最小值之间的差值),然后将其添加到基数(最小值)。

public double GetRandomNumber(double minimum, double maximum)
{ 
    Random random = new Random();
    return random.NextDouble() * (maximum - minimum) + minimum;
}

实际代码应该是随机的静态成员。这将节省创建随机数生成器的成本,并使您能够非常频繁地调用GetRandomNumber。由于我们在每次呼叫时初始化一个新的RNG,如果你打电话的速度足够快,系统时间不会在呼叫之间发生变化,RNG将获得完全相同的时间戳,并生成相同的随机数流。

答案 1 :(得分:37)

Johnny5建议创建一个扩展方法。这是一个更完整的代码示例,展示了如何执行此操作:

public static class RandomExtensions
{
    public static double NextDouble(
        this Random random,
        double minValue,
        double maxValue)
    {
        return random.NextDouble() * (maxValue - minValue) + minValue;
    }
}

现在您可以将其称为Random类上的方法:

Random random = new Random();
double value = random.NextDouble(1.23, 5.34);

请注意,您不应在循环中创建大量新的Random对象,因为这可能会使您连续多次获得相同的值。如果您需要大量随机数,则创建一个Random实例并重新使用它。

答案 2 :(得分:7)

最简单的方法是简单地生成0和两个数之差的随机数。然后将两个数字中较小的一个添加到结果中。

答案 3 :(得分:6)

注意:如果您在循环中生成random,例如for(int i = 0; i < 10; i++),请不要将new Random()声明放在循环中。

来自MSDN

  

随机数生成从种子值开始。如果相同   种子被重复使用,生成相同的数字序列。一   产生不同序列的方法是制作种子价值   与时间有关,从而与每个新系列产生不同的系列   随机的实例。默认情况下,无参数构造函数   随机类使用系统时钟生成其种子值...

基于这个事实,做一些事情:

var random = new Random();

for(int d = 0; d < 7; d++)
{
    // Actual BOE
    boes.Add(new LogBOEViewModel()
    {
        LogDate = criteriaDate,
        BOEActual = GetRandomDouble(random, 100, 1000),
        BOEForecast = GetRandomDouble(random, 100, 1000)
    });
}

double GetRandomDouble(Random random, double min, double max)
{
     return min + (random.NextDouble() * (max - min));
}

这样做可以保证您获得不同的双倍值。

答案 4 :(得分:3)

你可以使用这样的代码:

public double getRandomNumber(double minimum, double maximum) {
    return minimum + randomizer.nextDouble() * (maximum - minimum);
}

答案 5 :(得分:2)

你可以这样做:

public class RandomNumbers : Random
{
    public RandomNumbers(int seed) : base(seed) { }

    public double NextDouble(double minimum, double maximum)
    {
        return base.NextDouble() * (maximum - minimum) + minimum;
    }
}

答案 6 :(得分:1)

如果其中一个值为负数怎么办?不是更好的主意:

double NextDouble(double min, double max)
{
       if (min >= max)
            throw new ArgumentOutOfRangeException();    
       return random.NextDouble() * (Math.Abs(max-min)) + min;
}

答案 7 :(得分:1)

如果您需要[double.MinValue范围内的随机数; double.MaxValue]

// Because of:
double.MaxValue - double.MinValue == double.PositiveInfinity

// This will be equals to NaN or PositiveInfinity
random.NextDouble() * (double.MaxValue - double.MinValue)

改为使用:

public static class RandomExtensions
{
    public static double NextDoubleInMinMaxRange(this Random random)
    {
        var bytes = new byte[sizeof(double)];
        var value = default(double);
        while (true)
        {
            random.NextBytes(bytes);
            value = BitConverter.ToDouble(bytes, 0);
            if (!double.IsNaN(value) && !double.IsInfinity(value))
                return value;
        }
    }
}

答案 8 :(得分:0)

关于生成相同的随机数,如果在循环中调用它,一个漂亮的解决方案是将循环外的新Random()对象声明为全局变量。

请注意,如果要在循环中运行它,则必须在GetRandomInt函数之外声明Random类的实例。

“这是为什么?”你问。

嗯,Random类实际上生成伪随机数,随机函数的“种子”是系统时间。如果您的循环足够快,系统时钟时间将不会与随机数发生器不同,并且Random类的每个新实例都将从相同的种子开始,并为您提供相同的伪随机数。

来源在这里:http://www.whypad.com/posts/csharp-get-a-random-number-between-x-and-y/412/

答案 9 :(得分:0)

使用静态随机数,或者由于系统时钟为它们提供种子,因此数字倾向于在紧密/快速循环中重复。

public static class RandomNumbers
{
    private static Random random = new Random();
    //=-------------------------------------------------------------------
    // double between min and the max number
    public static double RandomDouble(int min, int max) 
    {
        return (random.NextDouble() * (max - min)) + min;
    }
    //=----------------------------------
    // double between 0 and the max number
    public static double RandomDouble(int max) 
    {
        return (random.NextDouble() * max);
    }
    //=-------------------------------------------------------------------
    // int between the min and the max number
    public static int RandomInt(int min, int max) 
    {   
        return random.Next(min, max + 1);
    }
    //=----------------------------------
    // int between 0 and the max number
    public static int RandomInt(int max) 
    {
        return random.Next(max + 1);
    }
    //=-------------------------------------------------------------------
 }

另请参阅:https://docs.microsoft.com/en-us/dotnet/api/system.random?view=netframework-4.8

答案 10 :(得分:-1)

Random random = new Random();

double NextDouble(double minimum, double maximum)
{  

    return random.NextDouble()*random.Next(minimum,maximum);

}