生成大于提供值的随机但统一的和的部分列表

时间:2016-10-18 19:40:33

标签: c# .net algorithm math

我正在尝试构建一个函数,该函数将生成与所提供值相加的随机数。但是,我还需要这些值大于提供的值。

我目前的尝试: 过程:( N = 10,M = 3的例子) 生成长度随机数(N-1)的列表。 将0和M(3)添加到该列表中。 对列表进行排序。 取相邻数字的差异。

这提供了Sum与Uniform量的随机细分。但是,现在我需要将这些金额限制为最小值。我很难过。

示例:

                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

2 个答案:

答案 0 :(得分:2)

只需选择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

答案 1 :(得分:1)

如果您的最小值为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