Tat*_*ter 2 javascript random numbers generator
我想要一点JavaScript,这将允许我生成4个随机数字,这些数字加起来等于某个值,例如
如果
max = 20
Run Code Online (Sandbox Code Playgroud)
然后
num1 = 4
num2 = 4
num3 = 7
num4 = 5
Run Code Online (Sandbox Code Playgroud)
要么
max = 36
Run Code Online (Sandbox Code Playgroud)
然后
num1 = 12
num2 = 5
num3 = 9
num4 = 10
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有...
var maxNum = 20;
var quarter;
var lowlimit;
var upplimit;
var num1 = 1000;
var num2 = 1000;
var num3 = 1000;
var num4 = 1000;
var sumnum = num1+num2+num3+num4;
quarter = maxNum * 0.25;
lowlimit = base - (base * 0.5);
upplimit = base + (base * 0.5);
if(sumnum != maxNum){
num1 = Math.floor(Math.random()*(upplimit-lowlimit+1)+lowlimit);
num2 = Math.floor(Math.random()*(upplimit-lowlimit+1)+lowlimit);
num3 = Math.floor(Math.random()*(upplimit-lowlimit+1)+lowlimit);
num4 = Math.floor(Math.random()*(upplimit-lowlimit+1)+lowlimit);
}
Run Code Online (Sandbox Code Playgroud)
对于我自己的项目,我找到了另一个解决方案,也许对其他人有帮助。
这个想法是让所有数字具有相同的概率...我想到的第一件事是创建一个[1,2,3,..,N,undefined,undefined,....]length数组,对其进行洗牌,并获取withmax的位置,但这对于大数字来说很慢。1,2,3,...,NindexOf
最后我找到了另一个我认为正确的解决方案:创建N0 到 1 之间的随机数,这就是“他们想要取的”分数的一部分。如果所有数字选择相同的数字(pe 1),它们都会得到相同的值。
代码,基于@devnull69的解决方案:
function generate(max, thecount) {
var r = [];
var currsum = 0;
for(var i=0; i<thecount; i++) {
r.push(Math.random());
currsum += r[i];
}
for(var i=0; i<r.length; i++) {
r[i] = Math.round(r[i] / currsum * max);
}
return r;
}
Run Code Online (Sandbox Code Playgroud)
编辑:Math.round 的此解决方案存在问题。假设我们想要 4 个数字加起来为 20,并在执行 Math.round 之前获取这些数字:
7.4 3.4 5.7 3.3
Run Code Online (Sandbox Code Playgroud)
如果将它们相加,总和为 20。但是如果应用 Math.round:
7 3 6 3
Run Code Online (Sandbox Code Playgroud)
他们将其加到 18。
然后在我的项目中,我必须进行另一轮,将这些“缺失”值赋予具有更高小数部分的数字。这变得更加复杂,例如:
function generate(max, thecount) {
var r = [];
var decimals = [];
var currsum = 0;
for(var i=0; i<thecount; i++) {
r.push(Math.random());
currsum += r[i];
}
var remaining = max;
for(var i=0; i<r.length; i++) {
var res = r[i] / currsum * max;
r[i] = Math.floor(res);
remaining -= r[i];
decimals.push(res - r[i]);
}
while(remaining > 0){
var maxPos = 0;
var maxVal = 0;
for(var i=0; i<decimals.length; i++){
if(maxVal < decimals[i]){
maxVal = decimals[i];
maxPos = i;
}
}
r[maxPos]++;
decimals[maxPos] = 0; // We set it to 0 so we don't give this position another one.
remaining--;
}
return r;
}
Run Code Online (Sandbox Code Playgroud)
该代码将创建四个整数,它们的总和为最大,并且不会为零
var max = 36;
var r1 = randombetween(1, max-3);
var r2 = randombetween(1, max-2-r1);
var r3 = randombetween(1, max-1-r1-r2);
var r4 = max - r1 - r2 - r3;
function randombetween(min, max) {
return Math.floor(Math.random()*(max-min+1)+min);
}
Run Code Online (Sandbox Code Playgroud)
编辑:这将创建thecount整数的总和max并返回它们在数组中(使用randombetween上面的函数)
function generate(max, thecount) {
var r = [];
var currsum = 0;
for(var i=0; i<thecount-1; i++) {
r[i] = randombetween(1, max-(thecount-i-1)-currsum);
currsum += r[i];
}
r[thecount-1] = max - currsum;
return r;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4639 次 |
| 最近记录: |