问:
如何在 JavaScript 中的两个指定变量之间生成随机整数,例如 x = 4 和 y = 8 会输出 4, 5, 6, 7, 8 中的任何一个?
答1:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
Mozilla Developer Network 页面上有一些示例:
/**
* Returns a random number between min (inclusive) and max (exclusive)
*/
function getRandomArbitrary(min, max){returnMath.random()*(max - min)+ min;}/**
* Returns a random integer between min (inclusive) and max (inclusive).
* The value is no lower than min (or the next integer greater than min
* if min isn't an integer) and no greater than max (or the next integer
* lower than max if max isn't an integer).
* Using Math.round() will give you a non-uniform distribution!
*/
function getRandomInt(min, max){
min =Math.ceil(min);
max =Math.floor(max);returnMath.floor(Math.random()*(max - min +1))+ min;}
这是它背后的逻辑。这是一个简单的三法则:
Math.random() 返回介于 0(包括)和 1(不包括)之间的 Number。所以我们有一个这样的间隔:
[0....................................1)
现在,我们想要一个介于 min(包括)和 max(不包括)之间的数字:
[0....................................1)[min .................................. max)
我们可以使用 Math.random 来获取 [min, max) 区间内的对应方。但是,首先我们应该通过从第二个区间中减去 min 来考虑问题:
[0....................................1)[min - min ............................ max - min)
这给出了:
[0....................................1)[0.................................... max - min)
我们现在可以应用Math.random,然后计算对应方。让我们选择一个随机数:
Math.random()|[0....................................1)[0.................................... max - min)|
x (what we need)
因此,为了找到 x,我们会这样做:
x =Math.random()*(max - min);
不要忘记加回 min,以便我们在 [min, max) 区间内得到一个数字:
x =Math.random()*(max - min)+ min;
这是 MDN 的第一个功能。第二个,返回一个介于 min 和 max 之间的整数,两者都包括在内。
现在要获取整数,您可以使用 round、ceil 或 floor。
您可以使用 Math.round(Math.random() * (max - min)) + min,但这会产生非均匀分布。 min 和 max 都只有大约一半的滚动机会:
min...min+0.5...min+1...min+1.5... max-0.5....max
└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘ ← Math.round()
min min+1 max
将 max 排除在区间之外,它的滚动机会甚至比 min 还要小。
使用 Math.floor(Math.random() * (max - min +1)) + min,您可以获得完全均匀的分布。
min.... min+1... min+2... max-1... max.... max+1(is excluded from interval)||||||
└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘ ← Math.floor()
min min+1 max-1 max
您不能在该等式中使用 ceil() 和 -1,因为 max 现在滚动的机会稍少,但您也可以滚动(不需要的)min-1 结果。
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
它这样做只是因为它调用了 floor,它向下取整。
@thezachperson31 您可以使用 round,但是 min 和 max 都只有一半的机会像其他数字一样滚动。您也可以减去一个并取 ceil。然而,由于 [0,1) 间隔,这使得 max 数字滚动的机会最小。
如果有人想测试此方法的分布,我创建了一个 JSFiddle:jsfiddle.net/F9UTG/1
@JackFrost 是的,没错。你不傻,你只是在学习:)
这个问题很老,但是理解这个答案让我花了太多时间哦,我认为在下一个 JavaScript 版本上扩展 math.random 会很有用
答2:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
var randomnumber =Math.floor(Math.random()*(maximum - minimum +1))+ minimum;
我知道这是一个非常古老的答案,但使用 (Math.random() * (maximum - minimum + 1) ) << 0 更快。
@IsmaelMiguel 使用二元运算符(x << 0、x | 0、~~x)而不是 Math.floor() 将 x 转换为范围比 Number.MAX_SAFE_INTEGER 小得多的二补码(2³²⁻¹ vs. 2⁵³),因此你必须谨慎使用它!
@IsmaelMiguel 哟,我刚刚在控制台中尝试了你的方法,随机得到一个负值! Math.randRange = (最小值,最大值) => (Math.random() * (最大值 - 最小值 + 1) ) << 0 Math.randRange(2,657348096152) -1407373159
@bluejayke因为657348096152(二进制1001100100001100111111111111000010011000)有40位,而按位算术使用32位。如果你执行 657348096152|0,你会得到 218099864(二进制的 1100111111111111000010011000)。
这是一个聪明的答案。使范围在内部 [min, max+1) 实际上实现了 [min, max] 包含两者的期望结果。谢谢! :)
答3:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
数学随机()
返回介于 min (included) 和 max (included) 之间的 integer random number:
function randomInteger(min, max){returnMath.floor(Math.random()*(max - min +1))+ min;}
或在最小值(包括)和最大值(不包括)之间的any random number:
function randomNumber(min, max){returnMath.random()*(max - min)+ min;}
有用的例子(整数):
// 0 -> 10Math.floor(Math.random()*11);// 1 -> 10Math.floor(Math.random()*10)+1;// 5 -> 20Math.floor(Math.random()*16)+5;// -10 -> (-2)Math.floor(Math.random()*9)-10;
** 总是很高兴被提醒(Mozilla):
Math.random() 不提供密码安全的随机数。不要将它们用于与安全相关的任何事情。请改用 Web Crypto API,更准确地说是 window.crypto.getRandomValues() 方法。
如果你使用 Math.ceil,那么 +1 可以省掉
答4:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
利用:
function getRandomizer(bottom, top){returnfunction(){returnMath.floor(Math.random()*(1+ top - bottom ))+ bottom;}}
用法:
var rollDie =getRandomizer(1,6);var results =""for(var i =0; i<1000; i++){
results +=rollDie()+" ";// Make a string filled with 1000 random numbers in the range 1-6.}
分解:
我们正在返回一个函数(从函数式编程中借用),该函数在调用时将返回值 bottom 和 top 之间的随机整数,包括在内。我们说“包含”是因为我们希望在可以返回的数字范围内同时包含底部和顶部。这样,getRandomizer( 1, 6 ) 将返回 1、2、3、4、5 或 6。
(‘bottom’ 是较小的数字,而 ‘top’ 是较大的数字)
Math.random()*(1+ top - bottom )
Math.random() 返回 0 和 1 之间的随机双精度数,如果我们将它乘以 1 加上 top 和 bottom 之间的差,我们将在 0 和 1+b-a 之间的某处得到一个双精度数。
Math.floor(Math.random()*(1+ top - bottom ))
Math.floor 将数字向下舍入到最接近的整数。所以我们现在有了 0 和 top-bottom 之间的所有整数。 1 看起来令人困惑,但它必须存在,因为我们总是向下舍入,所以如果没有它,将永远无法真正达到最高数字。我们生成的随机小数需要在 0 到 (1+top-bottom) 范围内,因此我们可以向下舍入并获得 0 到 top-bottom 范围内的整数:
Math.floor(Math.random()*(1+ top - bottom ))+ bottom
上一个示例中的代码为我们提供了 0 和 top-bottom 范围内的整数,因此我们现在需要做的就是将 bottom 添加到该结果中以获取范围 bottom 和 top 内的整数包括的。 😄
注意:如果你首先传入一个非整数值或更大的数字,你会得到不良行为,但除非有人要求,否则我不会深入研究参数检查代码,因为它与原始问题的意图相去甚远.
我意识到这是大约 2.5 年后,但是输入 1 和 6,您的函数会返回值 1、2、3、4 和 5,但绝不会返回 6,就像它是“包容性的”一样。
@some,可能会更糟,我是 2½ 年 + 1 天后 ^^
+1,我测试了您的代码,它似乎创建了一个正确的值。用于处理可能在代码中大量重复的固定场景的创造性结构。
为什么你在一个函数中有一个函数呢?
@Alph.Dev 将使用随机数生成器的逻辑与确定要使用的随机数分布的逻辑分离。当使用随机数生成器的代码接受它作为参数(一个始终返回新随机数的 0 参数函数)时,它可以与任何类型的随机数生成器一起使用。
答5:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
所有这些解决方案都使用了太多的火力。您只需要调用一个函数:Math.random();
Math.random()* max |0;
这将返回 0(包括)和 max(不包括)之间的随机整数。
这太干净了。谢谢!
OP 询问的是 4 和 8 之间的范围,而不是 8 和 0
然后它不起作用。 Math.random() * 10 | 5 仅输出 5 | 7 | 13
当心:这个答案不可靠。最大值:5 和最小值:1 返回:1、3、5。
答案没有错。人们显然不知道 | 位或运算符的作用。如前所述,此解决方案适用于下限 0 和非包含上限 max 之间的数字。
答6:
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
返回 1 到 10 之间的随机数:
Math.floor((Math.random()*10)+1);
返回 1 到 100 之间的随机数:
Math.floor((Math.random()*100)+1)
你的“之间”是包容的还是排斥的?即是 [1,10]、[1,10)、(1,10] 还是 (1,10)?
它是部分包含的:[1, *)
函数末尾需要 + 1 是什么?我猜它工作得很好。
@Shachi:这是下限(一个选择不当的例子)。 4,如题,会更好。
1太特别了。这将分解为其他数字,例如问题中的 4 和 8(范围将(大约)是 [4;12],而不是 [4;8])。
答7:
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
function randomRange(min, max){return~~(Math.random()*(max - min +1))+ min
}
如果您使用的是 Underscore.js 替代方案,您可以使用
_.random(min, max)
Underscore 实际上提供了一个 _.uniqueId() 函数,您可以为客户端模型调用该函数。
使用二元运算符(x << 0、x | 0、~~x)而不是 Math.floor() 将 x 转换为范围比 Number.MAX_SAFE_INTEGER 小得多的二补码(2³²⁻¹ 与 2⁵³),因此您有谨慎使用!
答8:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
如果你需要一个介于 0 和最大值之间的变量,你可以使用:
Math.floor(Math.random()* max);
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
max 是包容性的还是独占性的>?
@Tree 使用 Math.floor max 是唯一的。如果您希望 max 具有包容性,您可以使用 Math.round。
像这里的许多其他答案一样,这并没有回答问题(我的重点):“我如何生成随机整数 在两个指定变量之间 在 JavaScript 中,例如 x = 4 和 y = 8 将输出 4、5、6、7、8 中的任何一个?"。换言之,指定 range/closed interval 中的随机数(示例中为 [4; 8])。甚至标题都说“在特定范围内”。这属于评论。
答9:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
其他答案没有考虑 0 和 1 的完全合理的参数。相反,您应该使用 ceil 或 floor 的 round instead:
function randomNumber(minimum, maximum){returnMath.round(Math.random()*(maximum - minimum)+ minimum);}
console.log(randomNumber(0,1)); # 011010
console.log(randomNumber(5,6)); # 566556
console.log(randomNumber(3,-1)); # 131-1-1-1
您的回答是正确的,但我认为您的示例是错误的.. console.log(randomNumber(5,6)); # 9 6 6 5 7 7 做 9 & 7 介于 5 和 5 之间6? ......你应该更正它或解释..
最后一个例子可以被认为是一个空范围。例如,无效的输入参数。结果为空、抛出错误或类似情况。
答10:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
密码学强
要获得 [x,y] 范围内的 cryptographically strong 随机整数,请尝试:
让 cs = (x,y) => x + (y - x + 1)*crypto.getRandomValues(new Uint32Array(1))[0]/2**32 | 0 控制台.log(cs(4, 8))
这个很迷人
我会推荐这个
我在这个问题上陷入了困境,试图了解加密安全的含义。在这里结束:crypto.stackexchange.com/questions/39186/…
+1,这是最好的!但是,我使用了 (x, y) => x + crypto.getRandomValues(new Uint32Array(1))[0] % (y - x + 1) (整数模而不是浮点除法)
是否有可能得到解释,例如何时加密强度很重要以及为什么这个答案与 Math.random() 的答案不同?
答11:
huntsbot.com – 高效赚钱,自由工作
使用此函数获取给定范围内的随机数:
function rnd(min, max){returnMath.floor(Math.random()*(max - min +1)+ min);}
这与以前的答案有何不同?
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
版权归原作者 HuntsBot 所有, 如有侵权,请联系我们删除。