随机取2个范围(例如100和150)之间的30个数字(浮点数),总计为N

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随机取2个范围(例如100和150)之间的30个数字(浮点数),总计为N相关的知识,希望对你有一定的参考价值。

[我想生成两个范围(例如100到150)之间的总和为N的随机数。

到目前为止我所做的:

function randomNumbers() 

    let i, nb, min, max, totAtteindre, tot, ajout;

    let resultat = new (Array);
    let alea        = [];

    nb              = document.getElementById("nbjours").value;
    totAtteindre    = document.getElementById("total").value;
    min             = Math.ceil(document.getElementById("minimum").value);
    max             = Math.floor(document.getElementById("maximum").value);


    tot = 0;

    for (i = 0; i < nb ; i++)
    
        alea[i] = Math.random() * (max - min) + min;
        alea[i] = alea[i].toFixed(2);
        alea[i] = parseFloat(alea[i]);
        tot += alea[i];

    

    tot = parseFloat(tot);

    if (totAtteindre > tot)
    
        ajout = (totAtteindre - tot) / nb;
        ajout = ajout.toFixed(2);
        ajout = parseFloat(ajout);

        for (i = 0; i < nb ; i++)
        
            alea[i] += ajout;
            tot += ajout;
        

    
    else
    
        ajout = (tot - totAtteindre) / nb ;
        ajout = ajout.toFixed(2);
        ajout = parseFloat(ajout);

        for (i = 0; i < nb ; i++)
        
            alea[i] -= ajout;
            tot -= ajout;
        

    

    let tmp = totAtteindre - tot;
    tot += tmp;

    alea[0] += tmp;

    // Affichage en vert ou rouge pour les valeurs positives ou négatives
    for (i = 0; i < nb ; i++)
    
        if ((alea[i] > min) && (alea[i] < max))
        
            resultat += alea[i].toFixed(2).replace('.', ',').fontcolor("green");
            if (i < nb-1)
            
                resultat += "<br>";
            
        
        else
        
            resultat += alea[i].toFixed(2).replace('.', ',').fontcolor("red");
            if (i < nb-1)
            
                resultat += "<br>";
            
        
    

    document.getElementById("valeurs").innerhtml = resultat;
    document.getElementById("totalAp").innerHTML = tot.toFixed(2);
<body>
<main>

    <header>
        <h1 style="font-size: 40px; text-align: center; margin: 20px; border: solid 2px black; font-family: 'Big Caslon'"><strong>Générateur de valeurs aléatoires</strong></h1>
    </header>

    <section>
    <form style="display: block; margin: 20px; text-align: center;">
        <h1 style="margin-bottom: 50px; font-family: 'Big Caslon';" ><u>Veuillez saisir le nombre de valeurs, les bornes inférieures/supérieures approximatives et le montant à atteindre</u><br></h1>

        <fieldset>
            <legend><strong>Nombre de valeurs</strong></legend>
            <input id="nbjours" type="number" name ="nbj">
        </fieldset>

        <br>

        <fieldset>
            <legend><strong>Bornes journalières approximatives</strong></legend>
            <input id="minimum" type="number" name="mont1">
            <input id="maximum" type="number" name="mont2">
            <div class="help-tip">
                <p style="text-align: justify; font-size: smaller">Il est possible d'avoir un résultat dont les valeurs dépassent les bornes. <br>Dans ce cas-là, diminuez les bornes ou augmentez les.</p>
            </div>
        </fieldset>

        <br>

        <fieldset>
            <legend><strong>Montant à atteindre</strong></legend>
            <input id="total" type="number" name="to">
        </fieldset>
    </form>

        <div style="display: flex; justify-content: center; margin: 20px;">
            <button onclick="randomNumbers()" class="myButton">Générer</button>
        </div>
    </section>

    <section style="display: block; text-align: center; margin-top: 10px; width: 50%; margin-left: auto; margin-right: auto">

        <fieldset>

            <legend style="background-color: unset;">
                <button onclick="copyText('valeurs')">
                    Copier les valeurs
                </button>
                <br>
            </legend>
            <div id="valeurs" ></div>

        </fieldset>

    </section>

    <section style="text-align: center; margin: 10px; width: 30%; display: block; margin-left: auto; margin-right: auto">
        <fieldset>
            <legend style="background-color: firebrick"><strong>Total</strong></legend>
            <div id="totalAp"></div>
        </fieldset>
    </section>

</main>
</body>
</html>

如您所见,有时您获得的值低于最小值或最大值。

因为我将剩余的总数除以值的数量,然后将它们添加到每个值中。

我不知道是否有一种方法只能像方法一样严格地在两个范围(最小和最大)之间获取值。如果语句不将增加的值添加到将超过最小值/最大值并除以更多的值上,我可能会做。但是我尝试了一下,但仍然会得到严格限制在范围内的一两个。

答案

嗨,我不太懂代码,但是您可以简单地生成一个0≤n≤TargetNumber的数字,然后从目标数字中减去它。 E g

local N = 100

local firstNumber = math.random(0, N)
local secondNumber = N - firstNumber

local total = firstNumber + secondNumber

print(total)

Whoops误解了这个问题,不确定如何限制firstNumber和secondNumber的范围;)

另一答案

您可以检查间隔的总和是否等于总和,或者对最小值和最大值采用一个算术运算,或者如果对和进行调整以直接得到一个随机对,则取一个。

function generate(min, max, sum) 
    var v = min + max === sum
            ? Math.random() * (max - min) + min
            : Math.random() * (sum - max - min) + (min + max) / 2;

    return [v, sum - v];


console.log(...generate(6, 8, 15));
console.log(...generate(1, 10, 15));
console.log(...generate(6, 9, 15));
另一答案

此函数具有四个参数:sizeminmaxsum-,其中size是要生成的数组的长度。如果您通过的false /mix/ max组合是不可能完成的任务,则将返回size,这意味着每次选择最小值都仍然太高,或者每次选择最大值都仍然太低。

以上是关于随机取2个范围(例如100和150)之间的30个数字(浮点数),总计为N的主要内容,如果未能解决你的问题,请参考以下文章

scratch中的在1到6之间取随机一个数=1是啥意思?

c语言编程序,调用随机函数,产生30个100到200之间的随机整数,并计算其平均值

java编写程序:产生1000个1到1000之间的随机整数,并分别统计一定范围内的各数.

random随机生成10个数,然后冒泡排序

Day1上午解题报告

js取范围内的随机数