在C#中生成随机小数

78

如何获取一个随机的 System.Decimal?System.Random 并不直接支持它。


9
生成一个在 1 到 999 之间的随机整数,然后将结果除以 100,这样做不是更简单吗?例如,随机数 1 会变成 0.01,而 999 会变成 9.99。 - Stefan Z Camilleri
@StefanZCamilleri 取决于您需要随机小数的用途。请阅读下面一些答案。可以表示的可能Decimal值的完整范围非常大,需要一些思考才能获得随机整数以馈入Decimal构造函数。然后就是如何均匀生成的随机分布的十进制值的问题。 - Daniel Ballinger
此外,如果我没记错的话,0.01不在1和999之间。它小于1,因此不是有效的响应。 - Gary O. Stenstrom
14个回答

1

请查看以下链接,其中包含现成的实现,应该会有所帮助:

MathNet.Numerics, 随机数和概率分布

特别是广泛的分布,建立在直接派生自System.Random的随机数生成器(MersenneTwister等)之上,都提供了方便的扩展方法(例如NextFullRangeInt32、NextFullRangeInt64、NextDecimal等)。当然,您也可以只使用默认的SystemRandomSource,它仅仅是带有扩展方法的System.Random。

哦,如果需要,您还可以将RNG实例创建为线程安全的。

非常方便!

这是一个老问题,但对于那些刚开始阅读它的人来说,为什么要重复造轮子呢?


0

我想生成最多9位小数的“随机”小数。我的方法是生成一个双精度浮点数,然后将其除以所需的小数位数。

int randomInt = rnd.Next(0, 100);

double randomDouble = rnd.Next(0, 999999999);
decimal randomDec = Convert.ToDecimal(randomint) + Convert.ToDecimal((randomDouble/1000000000));

"randomInt"是小数点前的数字,你可以直接放0。 要减少小数点位数,只需删除随机数中的“9”和除数中的“0”。


-1
System.Random rnd = new System.Random();
System.Math.Round( Convert.ToDecimal(rnd.NextDouble() * (maxValue-minValue) + minValue) , decimalPlaces);

一行代码总是最好的,下面是完整的代码和示例

using System;
                    
public class Program
{
    public static void Main()
    {
        var val = GetRandomDecimal(0, 100, 2);
        Console.WriteLine(val.ToString());
    }

    
    static System.Random rnd = new System.Random();
    public static decimal GetRandomDecimal(int minValue, int maxValue, int decimalPlaces)
    {
        return System.Math.Round( Convert.ToDecimal(rnd.NextDouble() * (maxValue-minValue) + minValue) , decimalPlaces);
    }
        
}

https://dotnetfiddle.net/wt5XeZ


Math.Round 导致上下限数值的偏差。例如,如果我尝试生成 0 到 1 的数字,并保留 1 位小数,则 0.0 出现的频率为 20 分之一,1.0 同样如此。其他数字从 0.1 到 0.9 的出现频率是十分之一。这不是均匀的。 - Enigmativity

-1
    public static decimal RandomDecimal()
    {
        int a = RandomNumber(2, 10);
        int b = RandomNumber(0, 99);

        string c = a + "." + b;
        decimal d = decimal.Parse(c);
        return d;
    }

    public static int RandomNumber(int min, int max)
    {
        return _random.Next(min, max);
    }

请不要发布仅包含代码的答案。未来的读者将感激您解释为什么它回答了问题,而不是从代码中推断。由于这是一个旧问题,请解释它如何补充其他答案。如果它没有,那么请友好地删除答案。 - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接