2014-10-28 48 views
0

这个想法是:点击一个按钮用一个数组的唯一字符串取代标题。这样做的问题是,我使用数组的字符串之前是这样的:如何获得随机字符串通过点击从数组没有重复?

headlines = new Array("Good", "Bad", "Ugly", "Random Headline"); 
var randomNumberBefore = 4; 
alert (headlines[randomNumberBefore]); 

,但我不希望再次显示相同的标题,thatswhy是重点检查,实际指数randomNumberBefore不相同号码像新索引randomNumber。下面的函数对我来说很有意义,但有时它会返回相同的数字,导致标题被自己替换,用户注意到没有变化。

function randomNumberByRange (range, number) { 
    var r; 
    do { 
     var r = Math.floor(Math.random() * range); 
    } while (r == number); 
    return r; 
} 

$(document).on('click','.nextquote' , function() { 
    var randomNumber = randomNumberByRange(headlines.length, randomNumberBefore); 
    var nextHeadline = headlines[randomNumber]; 

    $(".bannertext").text(nextHeadline); 
    console.log(nextHeadline); 

}); 

任何想法得到独特的头条新闻每次点击?

这是我的starting fiddle

-

这里是final fiddle

+3

而当所有项目已经显示,显示什么? – dfsq 2014-10-28 18:32:33

+0

当,这是我见过的最随机的4个 – 2014-10-28 18:34:58

+0

Google for“(Knuth)Fisher Yates shuffle”,然后只显示他们的顺序。 – Alnitak 2014-10-28 18:36:15

回答

2

您忘记将旧值赋给randomNumberBefore;

var randomNumber = randomNumberByRange(headlines.length, randomNumberBefore); 

后把

randomNumberBefore = randomNumber; 

PS:有一种方法可以使randomNumberByRange功能更好的性能:

function randomNumberByRange (range, number) { 
    var r = Math.floor(Math.random() * (range-1)); 
    if(r >= number)r++; 
    return r; 
} 

但是,如果你有很多的标题,你的函数是好的足够了(因为碰撞概率随着列表中物品的数量而下降)

+0

对我感兴趣 - 谢谢! – p2or 2014-10-29 10:00:02

1

如果您不想重复,只需从阵列中删除使用的元素。

var h = new Array("Good", "Bad", "Ugly", "Random Headline"); 
while (h.length > 0) { 
    var i = Math.floor(Math.random() * h.length); 
    var t = h.splice(i, 1); 
    console.log(t); 
} 
+2

注意OP - 如果它不明显,这段代码将_destroy_原始数组 – Alnitak 2014-10-28 18:37:31

+0

简单而美丽:) - 谢谢Nit。 – p2or 2014-10-29 10:50:02

相关问题