【问题标题】:Javascript random number generator (generates every number once) using input使用输入的Javascript随机数生成器(生成每个数字一次)
【发布时间】:2018-10-18 18:12:40
【问题描述】:

我正在制作一个随机票生成器,它询问范围,当按下按钮时会在该数字范围内生成一个随机数。 代码遗漏了一个重要部分:生成的数字不能重复。 可能 Math.random 中使用 list 也是错误的。

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>

【问题讨论】:

  • 创建一个数字数组。洗牌阵列。弹出数字直到 array.length == 0
  • 因为它们根本不能在字符串中重复 (01234567890) 或者因为它们不能在彼此之后重复 (01234566789)?
  • 使用这个的设计有点搞笑。不确定是否只是因为它是示例代码,但是如果范围发生变化,您是否会重置随机数列表?我在那里看不到监听器,因此很难使用提供的 UI 编写代码来做你想做的事情。

标签: javascript random


【解决方案1】:

这可能不是最好的方法,因为它使用递归,但它确实有效。它获取一个随机数并将其添加到已使用数字列表中,确保不返回已使用数字数组中的数字。

有很多方法可以做到这一点,这只是其中之一。

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())
}

【讨论】:

    【解决方案2】:

    如果支持较新的语法或使用 babel,请使用 Set,如 const numbers = new Set(); 并将每个生成的数字添加到集合中。该集合将起作用,因此每个项目都是独一无二的。

    你也可以找到一种 es5 的方式来制作一个集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 2018-05-03
      • 2017-09-11
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2013-03-13
      相关资源
      最近更新 更多