随机取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));
另一答案
此函数具有四个参数:size
,min
,max
和sum
-,其中size
是要生成的数组的长度。如果您通过的false
/mix
/ max
组合是不可能完成的任务,则将返回size
,这意味着每次选择最小值都仍然太高,或者每次选择最大值都仍然太低。
以上是关于随机取2个范围(例如100和150)之间的30个数字(浮点数),总计为N的主要内容,如果未能解决你的问题,请参考以下文章
c语言编程序,调用随机函数,产生30个100到200之间的随机整数,并计算其平均值