如何防止 Math.random 重复返回?

How to keep Math.random from repeating a return?

提问人:preston17 提问时间:2/23/2023 最后编辑:Tim Lewispreston17 更新时间:3/31/2023 访问量:67

问:

所以我有这个 Math.random 函数,当我调用该函数时,它偶尔会连续两次或更多次返回相同的对象。任何想法如何解决这个问题?

let currentQuote;

let quoteGenerator = (response) => {
    let newQuote = response[Math.floor(Math.random() * response.length)];
    while (newQuote === currentQuote) {
        newQuote = response[Math.floor(Math.random() * response.length)];
        currentQuote = newQuote;
        console.log(newQuote);
        return newQuote;
    }
};
JavaScript 数学 随机 重复 地板

评论

0赞 Diego D 2/23/2023
跟踪以前的值,如果它没有变化,则请求一个新的随机数
0赞 mykaf 2/23/2023
存储上一个报价,如果 newQuote 相同,则生成另一个报价。FWIW,真正的随机性会有一些重复。
1赞 Robert Dodier 2/24/2023
请考虑构造可能值的排列,并逐个返回排列的元素。这将保证每个元素只返回一次。元素用完后,生成另一个排列并重复该过程。
0赞 preston17 2/24/2023
@RobertDodier你能给我举个例子吗?我真的很感激
1赞 pjs 2/24/2023
请参阅生日问题了解为什么会发生这种情况,费舍尔·耶茨(Fisher Yates)洗牌了解如何解决它。RosettaCode.org JavaScript 中有一个随机实现。

答:

0赞 Svízel přítula 2/23/2023 #1

问题在于,您的代码只对随机值重新滚动一次,因为 while 以返回值结束。如果连续三次获得相同的值,则无论如何都会返回该值。您需要移动作业并返回循环。

let lastQuote = null;

let quoteGenerator = (response) => {
    let newQuote = response[Math.floor(Math.random() * response.length)];

    while (newQuote === lastQuote) {
        newQuote = response[Math.floor(Math.random() * response.length)];
    }

    lastQuote = newQuote;
    return newQuote;
};

评论

0赞 preston17 2/24/2023
我已经在我的代码中实现了这一点,但仍然会在这里和那里得到一个重复的?有没有办法避免它,还是不可避免地会重复?