Javascript 如何不让两个连续的相同数字出现在数学中。random()

Javascript 如何不让两个连续的相同数字出现在数学中。random(),javascript,algorithm,Javascript,Algorithm,我正在做一个报价显示网站从youtube学习。我对一个问题很好奇。当我按下按钮时,它会出现两次或两次以上相同的引号,但有时并不总是(我使用Math.random()所以通常可以)。我希望当我按下按钮,它会改变,而不是停留在同一报价 我不知道,所以我什么也没做 const quotes = [ { author: 'Ramiz Karaeski', quote: 'Meyvayı soymadan içinden ne çıkacak bilemem, ka

我正在做一个报价显示网站从youtube学习。我对一个问题很好奇。当我按下按钮时,它会出现两次或两次以上相同的引号,但有时并不总是(我使用Math.random()所以通常可以)。我希望当我按下按钮,它会改变,而不是停留在同一报价

我不知道,所以我什么也没做

const quotes = [
    {
        author: 'Ramiz Karaeski',
        quote: 'Meyvayı soymadan içinden ne çıkacak bilemem, kardeş.'
    },
    {
        author: 'Franz Kafka',
        quote: 'Beyinlerimiz savaşsın isterdim ama görüyorum ki silahsınız bayım.'
    },
    {
        author: 'Fyodor Dostoyevski',
        quote: 'Cehennem nedir? Sevginin artık imkansız olduğuna dair çekilen bir acıdır.'
    },
    {
        author: 'Lev Tolstoy',
        quote: 'Herkes dünyayı değiştirmeyi düşünür, ama kimse kendini değiştirmeyi düşünmez.'
    },
    {
        author: 'Charles Bukowski',
        quote: 'İnsan her zaman ihanet eder sonunda. Kimseye güvenme.'
    },
    {
        author: 'Friedrich Nietzsche',
        quote: 'Oysa güzelliğin sesi kısıktır konuşurken; sadece en uyanık ruhlara yanaşır.'
    },
    {
        author: 'Sabahattin Ali',
        quote: 'On beş günlük ömrü on beş seneye sığdıramazsın da, on beş senelik ömrü on beş günde yaşayıverirsin!'
    }
]

const quoteAuthor = document.getElementById('author');
const displayQuote = document.getElementById('quote');
const buttonChange = document.getElementById('button-change-quote');

buttonChange.addEventListener('click', change);


let random = 0;
change();

function change() {
    random = Math.floor(Math.random() * quotes.length);
    quoteAuthor.innerHTML = quotes[random].author;
    displayQuote.innerHTML = quotes[random].quote;
}

您需要使用
do while
循环,不断生成一个新的随机数,直到它与以前的相同为止

let random = 0;
change();

function change() {
    let newRandom;
    do{
       newRandom = Math.floor(Math.random() * quotes.length);
    }
    while(newRandom === random)
    random = newRandom
    quoteAuthor.innerHTML = quotes[random].author;
    displayQuote.innerHTML = quotes[random].quote;
}

您需要跟踪当前/旧的随机数,然后将其与新的随机数进行比较,并不断生成新的随机数,直到获得新的随机数,如下所示:

let random = 0;
let lastRandom = null;

function change() {
    do {
      random = Math.floor(Math.random() * quotes.length);
    } while(random === lastRandom);
    lastRandom = random;
    quoteAuthor.innerHTML = quotes[random].author;
    displayQuote.innerHTML = quotes[random].quote;
}

另一种方法可以是这样的 它将调用change();如果随机数与旧随机数相同

<script>
const quotes = [
     {
        author: 'Ramiz Karaeski',
        quote: 'Meyvayı soymadan içinden ne çıkacak bilemem, kardeş.'
    },
    {
        author: 'Franz Kafka',
        quote: 'Beyinlerimiz savaşsın isterdim ama görüyorum ki silahsınız bayım.'
    },
    {
        author: 'Fyodor Dostoyevski',
        quote: 'Cehennem nedir? Sevginin artık imkansız olduğuna dair çekilen bir acıdır.'
    },
    {
        author: 'Lev Tolstoy',
        quote: 'Herkes dünyayı değiştirmeyi düşünür, ama kimse kendini değiştirmeyi düşünmez.'
    },
    {
        author: 'Charles Bukowski',
        quote: 'İnsan her zaman ihanet eder sonunda. Kimseye güvenme.'
    },
    {
        author: 'Friedrich Nietzsche',
        quote: 'Oysa güzelliğin sesi kısıktır konuşurken; sadece en uyanık ruhlara yanaşır.'
    },
    {
        author: 'Sabahattin Ali',
        quote: 'On beş günlük ömrü on beş seneye sığdıramazsın da, on beş senelik ömrü on beş günde yaşayıverirsin!'
    }
]


const quoteAuthor = document.getElementById('author');
const displayQuote = document.getElementById('quote');
const buttonChange = document.getElementById('button-change-quote');

buttonChange.addEventListener('click', change);

let random = 0;
change();

function change() {
var new_index = Math.floor(Math.random() * quotes.length);
if(new_index==random){
change();
return;
}else{
random=new_index;
}
    quoteAuthor.innerHTML = quotes[random].author;
    displayQuote.innerHTML = quotes[random].quote;
} 
</script>

常量引号=[
{
作者:“Ramiz Karaeski”,
引述:“卡德雷,梅瓦伊·索伊马丹·伊因登·内卡卡·比勒姆。”
},
{
作者:《弗兰兹·卡夫卡》,
引语:“BeyinErimiz savaşsın isterdim ama görüyorum ki silahsınız bayım.”
},
{
作者:'Fyodor Dostoyevski',
引述:“塞赫内姆·内迪尔?塞维吉尼·阿特·伊姆坎斯·奥杜乌纳·代尔凯伦·比尔·阿卡迪尔”
},
{
作者:《列夫·托尔斯泰》,
引述:“埃尔克斯·德尼亚伊·蒂尔梅伊·迪努尔,阿玛·金泽·肯迪尼·德尼亚伊·蒂尔梅伊·迪努梅兹。”
},
{
作者:《查尔斯·布可夫斯基》,
引述:“我要给她一个扎曼·伊哈内特·埃德尔·索南达,金赛·güvenme。”
},
{
作者:“弗里德里希·尼采”,
引述:“Oysa güzelliğin sesi kısıktır konuşurken;sadece en uyanık ruhlara yanaţr.”
},
{
作者:《萨巴哈廷阿里》,
引述:“在贝南尔克先生在贝塞内伊·sıdıdıramazsın da,在贝塞内利克先生在贝塞内尔克先生在维瑞森!”
}
]
const quoteAuthor=document.getElementById('author');
const displayQuote=document.getElementById('quote');
const buttonChange=document.getElementById('button-change-quote');
buttonChange.addEventListener('单击',更改);
设random=0;
改变();
函数更改(){
var new_index=Math.floor(Math.random()*quotes.length);
如果(新索引==随机){
改变();
返回;
}否则{
随机=新的指数;
}
quoteAuthor.innerHTML=quotes[random]。作者;
displayQuote.innerHTML=quotes[random]。quote;
} 

在代码中引入另一个变量

let random = 0;
let last_random = 0;
change();

function change() {
   random = Math.floor(Math.random() * quotes.length);

   if(random != last_random){
      last_random = random;
      quoteAuthor.innerHTML = quotes[random].author;
      displayQuote.innerHTML = quotes[random].quote;
   }else{
     change();
   }
}

我自己也不太喜欢使用循环。“不断尝试直到成功”的想法对我个人来说有点不雅观

我可以使用的另一种方法是从数组中删除以前选择的项,并将其存储在变量(
prev
)中。然后,从其余选项中选择随机项目

const quotes=[{作者:拉米兹·卡拉斯基,引述:'Meyvayısoymadan içinden neıkak bilemem,kardeş。},{作者:弗兰兹·卡夫卡,引述:'Beyinerimiz savaşsın isterdim ama görüyorum ki silahsınız bay m},{作者:'Fyodor Dostoyevski',引用:'Cehennem nedir?Sevginin artık imkansız olduğdairçekilen bir acıdır.},{作者:'Lev Tolstoy',引用:'Herkes dünyayıdeğiğiştirmeyişdünür,ama kimse kendini değiştirmeyişdşnmez nez.'作者:'s:'Charles Bukowan zameyi deşKimmeyişseyşseyşsey',{作者:'Friedrich Nietzsche',引用:'Oysa güzelliğin sesi kısıktır konuşurken;sadece en uyanık ruhlara yanaţr.},{作者:'Sabahattin Ali',引用:'On beşgünl kömr On beţseneye sţdţramazsţda,On beţsenelionţveryinţde!';
设random=0;
函数更改(){
让prev=quotes.splice(random,1)[0];//从选项中删除以前的选择
random=Math.floor(Math.random()*quotes.length);
//quoteAuthor.innerHTML=quotes[random]。作者;
//displayQuote.innerHTML=quotes[random]。quote;
log(`“${quotes[random].quote}”-${quotes[random].author}`);
quotes.push(prev);//将上一个选择添加回
}
//演示

对于(让i=0;i有一个更好的方法:有一个额外的变量来保存上一个引号。随机选择一个新的。然后交换这两个,这样新选择的引号现在就从选择列表中删除了

const chosen = quotes.splice(random,1)[0]

function change() {
    new_choice = Math.floor(Math.random() * quotes.length);
    // display quotes[new_choice]

    // Swap the "disabled" quote back into the list, removing the one just chosen.
    temp = chosen
    chosen = quotes[new_choice]
    quotes[new_choice] = temp
}

只需从其他可能性中选择:

let random = Math.floor(Math.random() * quotes.length);
change();

function change() {
    let previous = random;
    random = Math.floor(Math.random() * (quotes.length-1));
    if (random >= previous) {
        random+=1;
    }
    quoteAuthor.innerHTML = quotes[random].author;
    displayQuote.innerHTML = quotes[random].quote;
}

将调用放在
Math.random()上
while
循环中,继续尝试,直到得到另一个。另一种方法是临时删除所选元素,并在选择新元素后将其添加回。使用随机数,而不是选择,但与上一个选择的距离减少了一。这样您就不需要这样做l丢弃随机数。@aligur请加上它作为答案。它简单而优雅。这项任务主要是通过先正确地排列数组并逐个消耗物品来完成的。