我正在制作一个随机票证生成器,该生成器会询问范围,当按下按钮时会生成该数字范围内的随机数。 代码缺少重要部分:生成的数字无法重复。在 Math.random 中使用列表可能也是错误的。
function random_number() {
var list = [];
var range = document.getElementById('range').value;
for (var i = 1; i <= range; i++) {
list.push(i);
}
var random = Math.floor(Math.random(list) * range) + 1;
if (document.getElementById('display').innerText = random) {}
}
<input id="range" type="text">
<br/>
<button onclick="random_number()" "delete_number()" class="button"> <span id="display"></span> </button>
答案 0 :(得分:0)
如果支持较新的语法或使用babel,请使用Set
,例如const numbers = new Set();
,然后将每个生成的数字添加到集合中。该集合将起作用,以便每个项目都是唯一的。
您还可以找到一种ES5方式进行设置。
答案 1 :(得分:0)
这可能不是最好的方法,因为它使用递归,但它可以工作。它会获得一个随机数,并将其添加到已用数字列表中,确保不返回已用数字数组中的数字。
有很多方法可以做到这一点,这只是其中之一。
var usedNumbers = []
var randomNumber = function () {
var range = 10
// If the list of used numbers is the same as the range, we have gone
// through all numbers
if (usedNumbers.length === range) {
console.error('Max numbers reached')
return false
}
var list = []
for (var i = 1; i <= range; i++) {
list.push(i);
}
var random = Math.floor(Math.random(list) * range) + 1
// If the number appears in the list of used numbers, re-run the function
if (usedNumbers.indexOf(random) != -1) {
return randomNumber()
}
// add the number to the list
usedNumbers.push(random)
return random
}
// Get a random number 11 times (last one will return false)
for (var i = 0; i <= 10; i++) {
console.log(randomNumber())
}
这是另一种基于@Wainage注释的方法,它创建一个数组并从中弹出数字。
var upperLimit = 10
var range = []
// Add the range of numbers to the array
for (var i = 1; i <= upperLimit; i++) {
range.push(i)
}
var randomNumber = function () {
// pick a random number from the array
var random = range[Math.floor(Math.random() * range.length)]
// remove it from the array
range.splice(range.indexOf(random), 1)
return random
}
// Call a random number 15 times
// If no number, it will return undefined
for(var i = 0; i < 15; i++) {
console.log(randomNumber())
}