【问题标题】:How to Generate non Repeating Random Results? [duplicate]如何生成不重复的随机结果? [复制]
【发布时间】:2020-05-20 20:59:23
【问题描述】:

我对 JavaScript 完全陌生。从下面的代码中,确保单击时背景颜色不会重复的正确方法是什么?

添加:我需要下一个颜色而不是上一个颜色,因为如果是这样,您将无法知道单击时页面是否正常工作。如果整个数组随机重复本身就可以,只要相同的颜色随后不重复两次,例如红色,然后又是红色。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>01</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
    </head>
    <body>
        <div class="container">
            <div class="row vh-100 d-flex align-items-center">
                <div class="col text-center">
                    <button>Click Me!</button>
                </div>
            </div>
        </div>
    </div>
    <script>
    const button = document.querySelector('button')
    const body = document.querySelector('body')
    const colors = ['red', 'green', 'blue', 'yellow', 'pink', 'purple']

    body.style.backgroundColor = 'violet'
    button.addEventListener('click', changeBackground)

    function changeBackground(){
        const colorIndex = parseInt(Math.random()*colors.length)
        body.style.backgroundColor = colors[colorIndex]
    }
    </script>
</body>
</html>

【问题讨论】:

  • 1.随机排列数组 2. 按顺序从中取出项目。它是随机的,并且不重复。
  • 我需要了解...您总共有 6 种颜色...那么如果用户单击 6 次然后没有其他唯一颜色可用...最终会重复... .??
  • 您好,我将编辑问题,我只需要下一个颜色而不是上一个颜色,因为如果是这样,您无法知道单击时页面是否正常工作。只要相同的颜色不重复两次,它们就可以重复自己。编辑:例如红色后不能再变红只是为了说明页面正常工作。
  • 介意提供示例代码吗?抱歉,我是个新手。
  • 如果你使用randojs.com,你可以使用colors = randoSequence(colors); var nextColor = colors.pop().value;

标签: javascript math random


【解决方案1】:

颜色代码表示有3种方式:

  • COLOR NAME

  • HEX color code

  • RGB color code.

    十六进制颜色代码 - 由哈希码 (#) 后跟十六进制数字组成。 例如:RED 具有十六进制颜色代码 = #FF0000

我们可以使用Math.random()函数to generate random hexadecimal color code

下面是工作代码sn-p。

function GenerateRandomColor() {
  return '#' + Math.floor(Math.random()*16777215).toString(16);
}

请注意,Math.random() 函数返回一个浮点数,带有scale of 16(小数点后的位置),如果我们将它乘以像上面这样的某个大数,得到重复值的机会非常非常小。

【讨论】:

  • 您不能保证它们不会重复,或者它们不会足够接近而无法本质上重复。此外,它们可能会与其他颜色发生冲突。
  • 如果我们谈论概率,那么在上述情况下它将在 1/ 16000000 左右,这是一个非常非常非常小的数字。但是,是的,你是对的。
  • @RishuRanjan :既然我们在这里谈论数学,我想提醒一下,OP 的主要关注点不是获得视觉上相同的顺序颜色,因此实际几率连续获得 2 种视觉上无法区分的颜色(即使具有不同的十六进制代码)比您的估计值大大
  • 我喜欢这个答案,因为它是最简单的(我完全是新手),但它不能保证颜色在视觉上是可区分的。对不起,'#' 是什么意思返回 '#'?无法通过 Google 找到答案。
  • 颜色代码表示有 3 种方式:颜色名称 |十六进制颜色代码| RGB 颜色代码。十六进制颜色代码 - 由 hascode (#) 后跟十六进制数字组成。例如:RED 具有十六进制颜色代码 = #FF0000。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2011-03-06
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多