C#如何生成一个范围内的随机数,偏向范围的低端? [复制]

Posted

技术标签:

【中文标题】C#如何生成一个范围内的随机数,偏向范围的低端? [复制]【英文标题】:C# How to generate a random number in a range, biased toward the low end of the range? [duplicate] 【发布时间】:2021-03-02 14:49:04 【问题描述】:

喂! 我的代码是:

    class Program
        
            static void Main(string[] args)
            
                for (int x = 0; x < 15000; x++)
                
                    int minValue = 1;
                    int maxValue = 1400;
                var rand = new Random();

                List<float> weights = new List<float>();
                List<float> numbers = new List<float>();
                for (int i = minValue; i <= maxValue; i++)
                
                    weights.Add((int)Math.Pow(i, 0.4));
                    numbers.Add(i);
                
                weights.Reverse();

                int weightSum = 0;
                foreach (int weight in weights)
                
                    weightSum += weight;
                

                List<int> possibleNumberList = new List<int>();

                float randomNumber = rand.Next(minValue, weightSum);

                float leastDifference = 2000000000f;
                int leastDifferenceNumberIndex = -1;
                for (int weightIndex = 0; weightIndex < weights.Count - 1; weightIndex++)
                
                    if (Math.Abs(weights[weightIndex] - randomNumber) == leastDifference)
                    
                        leastDifference = Math.Abs(weights[weightIndex] - randomNumber);
                        leastDifferenceNumberIndex = weightIndex;

                        possibleNumberList.Add(weightIndex);
                    
                    else if (Math.Abs(weights[weightIndex] - randomNumber) < leastDifference)
                    
                        leastDifference = Math.Abs(weights[weightIndex] - randomNumber);
                        leastDifferenceNumberIndex = weightIndex;
                        possibleNumberList = new List<int>();
                        possibleNumberList.Add(weightIndex);
                    
                

                var randFromListR = new Random();

                int listCunt = possibleNumberList.Count;
                int index = randFromListR.Next(0, listCunt);
                WWriteStringToNewLine(possibleNumberList[index].ToString());
            
        
    

我的目标是在图像中显示一个列表或数组

虽然我的最大值是 1400。

使用我的代码,我只能实现以下输出:

如果我们放大,我们可以看到有一些更高的数字,但只生成了一次。

如果我们将代码的最大值设置为 10,则输出如下:

3: 2837, 0: 2813, 4: 2781, 2: 2761, 1: 2759, 5: 273, 6: 264, 7: 262, 8: 250

我可以对此代码进行哪些更改以使其正常工作?你有什么建议?你甚至可以给我一个完全不同的代码。

【问题讨论】:

“偏向低端”这是非常模糊的,可以通过各种不同的方式来实现(基本示例是生成 2 个随机数并只返回最低的一个)。然后你显示一个直方图,但不要说这是否只是一个偏向低端的分布的例子,或者你是否想要那个精确的分布? (找到一个适合的公式是否足够好,或者您想通过对提供的直方图进行采样来绘制随机数?) 【参考方案1】:

如果您将一个函数应用于您的随机结果,这将改变您的号码重新分区。 我试过这些: Exp(Random.Next(0,10000) / 100d) 将生成一个带有您显然寻求的重新分区的数字

Sqrt(Random.Next(0,10000)) 将生成一个从 0 到 100 的数字,并进行平方根重新分区。

如果需要,可以取整数部分

【讨论】:

以上是关于C#如何生成一个范围内的随机数,偏向范围的低端? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server生成指定范围内的随机数

使用 C#,如何将变量设置为范围内的随机数? [复制]

在VB中,如何生成某个范围内的随机整数?

Java如何生成一定范围内的随机数? [复制]

js如何生成指定范围内的随机数

如何在excel中生成一个在一定范围内的随机数