如何生成总和为预定值的N个随机值?

Was*_*RAR 23 .net c# random generator

我需要你帮助解决一个小问题.我有四个标签,我想在它们上面显示0到100之间的随机值,它们的总和必须是100.

这是我的代码:

private void randomly_Click(object sender, EventArgs e)
{
    double alpha = 0, beta = 0, gamma = 0, delta = 0;
    double temp;
    int tempDouble;

    Random rnd = new Random();

    alpha = rnd.Next(0, 100);

    temp = 100 - alpha;
    tempDouble = (int)temp;
    beta = rnd.Next(0, tempDouble);

    temp = 100 - (alpha + beta);
    tempDouble = (int)temp;
    gamma = rnd.Next(0, tempDouble);

    temp = 100 - (alpha + beta + gamma);
    tempDouble = (int)temp;
    delta = rnd.Next(0, tempDouble);

    temp = alpha + beta + delta + gamma;
    temp = 100 - temp;
    temp = temp / 4;

    alpha = alpha + temp;
    beta = beta + temp;
    gamma = gamma + temp;
    delta = delta + temp;

    cInsertion.Text = alpha.ToString();
    cMoyens.Text = beta.ToString();
    cInternational.Text = gamma.ToString();
    cRecherche.Text = delta.ToString();
}   
Run Code Online (Sandbox Code Playgroud)

问题在于我给alpha获得biggest值的机会,以及delta的lowest值.

有没有办法让他们有同样的机会拥有真正的random价值?

Iva*_*rić 45

你可以这样做:

double alpha = 0, beta = 0, gamma = 0, delta = 0, k = 0;
Random rnd = new Random();

alpha = rnd.Next(0, 100);
beta = rnd.Next(0, 100);
gamma = rnd.Next(0, 100);
delta = rnd.Next(0, 100);

k = (alpha + beta + gamma + delta) / 100;

alpha /= k;
beta /= k;
gamma /= k;
delta /= k;

cInsertion.Text = alpha.ToString();
cMoyens.Text = beta.ToString();
cInternational.Text = gamma.ToString();
cRecherche.Text = delta.ToString();
Run Code Online (Sandbox Code Playgroud)

这样你就说让我们为所有4个变量取一个随机值,然后我们将它们缩放一个因子k,使它们的总和为100.


I82*_*uch 6

如果你将所有四个值都放在一个数组中,然后将它们洗牌,然后根据它们的序数位置分配它会怎么样?这样,每个变量(gamma,theta等)具有获得高数量和低数量的相等概率.

  • +1你真的是唯一真正读过这个问题的人吗?;) (2认同)