生成 4 个随机数,这些随机数在 Javascript 中添加到某个值
Generate 4 random numbers that add to a certain value in Javascript
我想要一些javascript,它允许我生成4个随机数,这些随机数加起来达到某个值,例如
如果
max = 20
然后
num1 = 4
num2 = 4
num3 = 7
num4 = 5
或
max = 36
然后
num1 = 12
num2 = 5
num3 = 9
num4 = 10
到目前为止,我所拥有的是...
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);
}
此代码将创建四个整数,这些整数的总和为最大数字,并且不会为零
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);
}
编辑:这个将创建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;
}
对于我自己的项目,我找到了另一个可能对其他人有帮助的解决方案。
这个想法是让所有数字都有相同的概率......我想到的第一件事是创建一个长度max
[1,2,3,..,N,undefined,undefined,....]
数组,对其进行洗牌,并得到indexOf
1,2,3,...,N
的位置,但这对于大数字来说很慢。
最后,我找到了另一个我认为正确的解决方案:在 0 和 1 之间创建N
个随机数,这是"他们想要取"的分数的一部分。如果所有数字都选择相同的数字(p.e. 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;
}
编辑:Math.round的这个解决方案存在问题。想象一下,我们想要 4 个加起来为 20 的数字,并在执行 Math.round 之前获得此数字:
7.4 3.4 5.7 3.3
如果将它们相加,它们的总和为 20。但是如果你应用Math.round:
7 3 6 3
他们将其添加到 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;
}
任何
语言的伪代码。
a = rand()
b = rand()
c = rand()
d = rand()
total = a + b + c + d
adjust = desiredNumber / total
a *= adjust
b *= adjust
c *= adjust
d *= adjust
试试这个:
- 首先生成一个介于 0 和最大减 3 之间的数字(对于三个数字左(。
- 然后在第一个数字和最大值之间生成一个数字减去 2。
- 然后在第一个数字加上第二个数字之间生成一个数字和最大值减 1。
- 然后最后一个数字是剩下的数字。
并不是说生成的随机数都应该是不同的,例如,如果数字的总和应该是 4,这是不可能的。
<!DOCTYPE html>
<html>
<head>
<title>Random numbers</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
function randomSum(sum, nrOfNumbers) {
var a = new Array(nrOfNumbers);
var i = 0;
var remainingSum = sum;
while(i < nrOfNumbers) {
if(i == (nrOfNumbers -1)) {
a[i] = remainingSum;
}
else {
// get a random number in range [0, remainingSum]
a[i] = Math.floor(Math.random() * (remainingSum + 1));
remainingSum -= a[i];
}
++i;
}
return a;
}
</script>
</head>
<body>
<script type="text/javascript">
var randomNumbers = randomSum(20,4);
for(var i in randomNumbers) {
document.writeln(randomNumbers[i]+"<br>");
}
</script>
</body>
</html>
相关文章:
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在映射数组中添加换行符
- 正在将数据主题添加到所有项目
- ZeroClipboard-在复制之前添加到值
- 我可以在json对象中添加一个函数吗
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 正在SharePoint 2013母版页中添加JQuery移动文件
- 如何添加浮动和非浮动,其他
- 添加文字和评论功能更新Div
- Javascript动态变量(添加了随机数)
- 在javascript中添加和显示对象的随机数组中的视频
- 将随机数添加到登录表单的URL的目的是什么
- 生成 4 个随机数,这些随机数在 Javascript 中添加到某个值
- Javascript-添加在for循环中生成的随机数
- 从一个随机数添加一个类
- 我如何在min.js文件之前添加一些随机数,使用grunt或gulp
- 在URL后添加随机数
- 每24小时添加一个随机数
- 如何将随机数添加到结果处的存储变量中,作为一个数字,而不是两个字符串加在一起
- 帮助添加变量到自我和随机数(javascript)