为多个字段生成数字

xxx*_*017 3 c# algorithm

我有5个字段,我希望它们都有0到100之间的生成数字.但是,5个字段的总和应该是100.

当我想为一个字段提供一个随机数时,我会做以下事情:

Random rnd = new Random();
int x= rnd.Next(1, 10);
Run Code Online (Sandbox Code Playgroud)

但是,我应该如何为需要总和为100的多个字段执行此操作?

qwe*_*man 9

您可以使用以下方法:

  1. 在[0,100]中生成4个随机整数
  2. 对它们进行排序,让我们表示排序的值作为0≤X 1 ≤X 2 ≤X 3 ≤X 4 ≤100
  3. 使用以下5个值作为总和100的随机数:
    • N 1 = x 1
    • N 2 = x 2 - x 1
    • N 3 = x 3 - x 2
    • N 4 = x 4 - x 3
    • N 5 = 100 - x 4

它基本上对应于在[0,100]间隔上随机添加4个切片点,并使用5个结果间隔的长度作为随机数:

在此输入图像描述

const int k = 5;
const int sum = 100;

Random rnd = new Random();
int[] x = new int[k + 1];

// the endpoints of the interval
x[0] = 0;
x[k] = sum;

// generate the k - 1 random sectioning points
for (int i = 1; i < k; i++)
{
    x[i] = rnd.Next(0, sum + 1);
}

// sort the sectioning points
Array.Sort(x);

// obtain the k numbers with sum s
int[] N = new int[k];
for (int i = 0; i < k; i++) {
    N[i] = x[i + 1] - x[i];
}
Run Code Online (Sandbox Code Playgroud)


Dmi*_*try 5

为了使你的分布均匀,你可以尝试以下方法:

  1. 生成一些随机数。
  2. 使它们正常化。
  3. 如果需要,更正最后一个字段以准确获得预期的总和。

代码:

const int ExpectedSum = 100;

Random rnd = new Random();
int[] fields = new int[5];

// Generate 4 random values and get their sum
int sum = 0;
for (int i = 0; i < fields.Length - 1; i++)
{
    fields[i] = rnd.Next(ExpectedSum);
    sum += fields[i];
}

// Adjust the sum as if there were 5 random values
int actualSum = sum * fields.Length / (fields.Length - 1);

// Normalize 4 random values and get their sum
sum = 0;
for (int i = 0; i < fields.Length - 1; i++)
{
    fields[i] = fields[i] * ExpectedSum / actualSum;
    sum += fields[i];
}

// Set the last value
fields[fields.Length - 1] = ExpectedSum - sum;
Run Code Online (Sandbox Code Playgroud)

实例: https: //dotnetfiddle.net/5yXwOP