[英]generate random number with a specific sum
How do I generate 8
random numbers from 1
to 100
The sum of 8
numbers is 200
Not Without repeating the same numbers in each group Showing all possible outcomes.如何生成从
1
到100
的8
个随机数8
个数字的总和是200
不是没有在每组中重复相同的数字 显示所有可能的结果。
It depends on what random means here.这取决于随机在这里的含义。 You can, for instance, put a problem like this:
例如,您可以提出这样的问题:
There is a stick of length
200
We should put8 - 1 = 7
random marks on it to cut stick into8
pieces and return the lengths of these pieces.有一根长度为
200
的棍子,我们应该在上面打上8 - 1 = 7
随机标记,将棍子切成8
块,并返回这些块的长度。
Let's draw a pictute:让我们画一个图:
[----------------------------------------------------------]
^ ^ ^ ^ ^ ^ ^ ^ ^
0 33 83 135 138 157 177 186 200 <- points
33 50 52 3 19 20 9 14 <- lengths
Code:代码:
Random random = new Random();
...
int length = 200;
int count = 8;
int prior = 0;
int[] values = Enumerable
.Range(0, count - 1)
.Select(_ => random.Next(0, length + 1))
.OrderBy(item => item)
.Append(length)
.Select(item => {
int savedPrior = prior;
prior = item;
return item - savedPrior; })
.ToArray();
If you want all values
being distinct you can try repeating the procedure when they are not:如果您希望所有
values
都不同,您可以尝试在它们不同时重复该过程:
int[] values;
int length = 200;
int count = 8;
do {
int prior = 0;
values = Enumerable
.Range(0, count - 1)
.Select(_ => random.Next(0, length + 1))
.OrderBy(item => item)
.Append(length)
.Select(item => {
int savedPrior = prior;
prior = item;
return item - savedPrior; })
.Distinct()
.ToArray();
}
while (values.Length != count);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.