簡體   English   中英

生成具有特定總和的隨機數

[英]generate random number with a specific sum

如何生成從11008個隨機數8個數字的總和是200不是沒有在每組中重復相同的數字 顯示所有可能的結果。

這取決於隨機在這里的含義。 例如,您可以提出這樣的問題:

有一根長度為200的棍子,我們應該在上面打上8 - 1 = 7隨機標記,將棍子切成8塊,並返回這些塊的長度

讓我們畫一個圖:

[----------------------------------------------------------]
^     ^     ^      ^       ^       ^       ^       ^       ^ 
0    33    83     135     138     157     177     186     200 <- points

  33    50     52      3      19      20       9       14     <- lengths

代碼:

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();

如果您希望所有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM