生成总和大于给定值的随机但一致部分的列表
本文关键字:随机 致部 列表 大于 | 更新日期: 2023-09-27 18:13:41
我正在尝试构建一个函数,该函数将生成随机数之和为所提供的值。但是,我还需要这些值大于提供的值。
我当前的尝试:过程:(以N = 10, M = 3为例)生成一个长度为N-1的随机数列表。将0和M(3)添加到该列表中。排序列表。取相邻数之差
这提供了具有统一金额的Sum的很好的随机分解。但是,现在我需要将这些数量限制为最小值。
例子:
var r = new Random();
var N = 10;
var M = 3*100;
var startingList = new List<int>();
for (int i = 1; i <= N - 1; i++)
{
startingList.Add(r.Next(0, M));
}
startingList.Add(0);
startingList.Add(M);
startingList = startingList.OrderBy(o => o).ToList();
startingList.ForEach(Console.WriteLine);
var a = 0;
var b = 1;
var randomList = new List<double>();
for (int i = 1; i <= startingList.Count-1; i++)
{
double difference = (Convert.ToDouble(startingList[b]) - Convert.ToDouble(startingList[a]))/100;
randomList.Add(difference);
a++;
b++;
}
randomList.ForEach(f => Console.Write(f + ", "));
Console.WriteLine("Sum = " + randomList.Sum());
Console.ReadLine();
输出:0
33
84
142
175
209
230
245
272
298
300
0.33, 0.51, 0.58, 0.33, 0.34, 0.21, 0.15, 0.27, 0.26, 0.02, Sum = 3
0
1
2
5
75
101
140
203
204
295
300
0.01, 0.01, 0.03, 0.7, 0.26, 0.39, 0.63, 0.01, 0.91, 0.05, Sum = 3
0
26
44
73
83
96
140
168
178
189
300
0.26, 0.18, 0.29, 0.1, 0.13, 0.44, 0.28, 0.1, 0.11, 1.11, Sum = 3
选取N个随机数字,与M/theirsum
相乘进行归一化
int N = 10;
int M = 3;
Random rnd = new Random();
var tempRandoms = Enumerable.Range(0, N).Select(_ => rnd.NextDouble()).ToArray();
var sum = tempRandoms.Sum();
var randoms = tempRandoms.Select(x => x* M/sum).ToArray();
var check = randoms.Sum(); //should be equal to M
如果您的最小值是min
并且您生成N
数字,那么您将最终得到至少min * N
的总和。所以剩余的M - min * N
空间是你可以随机抽样的空间。大致思路如下:
samples := N random samples in [0, 1)
sum := sum(samples)
for each s in samples
emit min + s * (M - min * N) / sum