为什么当我给他一个负数和一个正数时,我的 JS 随机整数生成器如此错误
Why is my JS random ints generator so wrong when I give him one negative and one positive number?
所以我使用这样的脚本在范围内随机生成整数
function randomInRange(start, end)
{
if ((start >= 0) && (end >= 0))
{
return Math.round(Math.abs(start) + (Math.random() * (Math.abs(end) - Math.abs(start))));
}
else if ((start <= 0) && (end <= 0))
{
return 0 - (Math.round(Math.abs(start) + (Math.random() * (Math.abs(end) - Math.abs(start)))));
}
else
{
return Math.round(((start) + Math.random() * (end - start)));
}
}
你可以在这里看到它的工作。 对于正范围它是正确的,对于负范围它是正确的,但我得到混合的糟糕和错误的结果。为什么以及如何修复它?
我尝试使用类似Math.round(start + Math.random() * (end - start));
的公式
如果你使用Math.round
你会得到一个不均匀的分布。
4,而 2.5 和 3.5 之间的数字将四舍五入为 3。这意味着 50% 的数字将是 3,而只有 25% 将是 2,25% 将是 4。
请改用Math.floor
来获得随机数的均匀分布。
您不必检查start
和end
的符号,表达式end - start + 1
将是范围的大小,符号根据start
的哪一侧而不同。
function randomInRange(start, end) {
if (start > end) start++; else end++;
return Math.floor((start + Math.random() * (end - start)));
}
演示:jsfiddle.net/guaEp/1/
校正:
如果start
> end
,表达式 end - start + 1
不起作用。如果上限是排除的,则表达式 end - start
有效,即范围 -10 到 11 返回 -10 到 10 之间的数字。我添加了代码,以便该函数采用包含上限并将其转换为独占。
也:
正如 davin 指出的那样,您正在馈送函数字符串,这将使函数连接字符串而不是进行算术运算。
只需使用 parseInt 函数将字符串转换为数字:
val.innerHTML = randomInRange(parseInt($('fnt').value), parseInt($('lint').value));
好的,我发现了问题,您正在对字符串执行代数(因为在您的代码中$('fnt').value
是输入框的值,这是一个字符串(,而不是数字,所以像+
这样的东西最终会连接字符串而不是添加它们的数字内容。在您的特定示例中,您有:
Math.round(((start) + Math.random() * (end - start)))
其计算结果为:
Math.round((('13') + Math.random() * ('-666' - '13')))
其计算结果为(例如(:
Math.round("13-339.44615370430984")
由于'13' + '-339.44615370430984'
将被串联起来,最后Math.round
调用将返回NaN
您应该具备:
function randomInRange(start, end) {
start = Number(start); end = Number(end);
return Math.round(start + Math.random() * (end - start));
}
或者更改传递到函数中的值,确保它们是数字。
function randomInRange(start, end) {
return Math.round(start + Math.random() * (end - start));
}
应该工作。
jsFiddle 演示
更新:正如@Guffa正确指出的那样,分布不会均匀。您可以使用它:
return Math.floor(start-- + Math.random() * (end - start));
我懒得在你的代码中找到错误,但计算可以更容易地完成:
function randomInRange(start, end)
{
//Extra variables to make it easier to understand
var rangeBegin = Math.min(start,end);
var rangeEnd = Math.max(start,end);
var rangeSize = rangeEnd-rangeBegin+1;
var seed = Math.random();
var result = Math.floor((seed*rangeSize)+rangeBegin);
return result;
}
- 我想在AngularJS应用程序中创建一个输入数字框,用户不应该在该框上键入十进制数字.(一个整数输入框)
- Javascript-当存在's是一个整数标记
- 如何拆分一个整数和产生的所有数字来创建一个新数字
- 找到字符串值,但需要一个整数
- 使用javascript向上取整到下一个整数,即使值为1.0000000001
- 只使用一个整数表示颜色-Javascript
- 在字符串名称后附加一个整数
- JavaScript:将一个整数与一长串字符串关联起来
- 如何传递一个整数来创建新的变量名
- 将浮点数向上舍入到 javascript 中的下一个整数
- node.js - 发送一个整数作为 POST 请求中的输入参数
- 在类名的末尾添加一个整数
- 正则表达式仅检查一个整数
- 正则表达式,用于将字符串中的最后一个整数与 php 和 javascript 匹配
- 使用 node-soap 传递一个整数数组
- 求一个整数数组的最高子集,其总和加起来就是给定的目标
- 如何将一个整数数组作为参数从javascript传递到python
- 在Javascript中将rgba值转换为一个整数
- 我需要将一个整数除以12,如果结果是浮点值,则用javascript将其加1
- 为什么在控制台上记录对象引用时会显示一个整数