在我的网站上,我有一个按钮,可以从引号列表中选择一个随机引用,并将随机选择的引号投影到文本框中。这是使用JavaScript完成的。
虽然我有这个工作,但我想要一个额外的代码,以防止直接后续引用与前一个相同。我想任何引用都可以再次出现,但不是直接跟随。
如果可能的话,我也会喜欢它,所以任何使用的引用都不会再出现至少3次点击 - 但这只是一个奖励。
无论如何,我目前的代码如下:
<head>
<script language="javascript"><!--
function GenerateQuote(){var aquote=new Array;
aquote[0]="\"Quote0\"";
aquote[1]="\"Quote1\"";
aquote[2]="\"Quote2\""
aquote[3]="\"Quote3\"";
aquote[4]="\"Quote4\"";
aquote[5]="\"Quote5\"";
aquote[6]="\"Quote6\"";
rdmQuote=Math.floor(Math.random()*aquote.length);
document.getElementById("quoteBox").value=aquote[rdmQuote];
}
-->
</script>
</head>
<body>
<textarea id="quoteBox" readonly></textarea>
<button onClick="GenerateQuote()">Entertainment & Hobbies</button>
</body>
提前致谢;我相信你对brainiacs来说不会太难!
答案 0 :(得分:1)
.sort()
方法,甚至可以更好地查找Fisher-Yates
alghoritm pop()
,这样每次都会生成不同的引号,直到数组完全耗尽参考:
答案 1 :(得分:1)
<head>
<script type="text/javascript">
!function (){
var quotes = ["quote0", "quote1", "quote2", "quote3", "quote4", "quote5", "quote6", "quote7", "quote8"],
shuffleAfter = quotes.length, cur = 0;
function shuffle( arr ) {
var l = arr.length, j, i, tmp;
for( i = l - 1; i > 0; --i ) {
j = ( Math.random() * ( i + 1 ) ) >>> 0;
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
return arr;
}
function generateQuote(){
var r;
if( cur++ % shuffleAfter === 0 ) {
shuffle(quotes);
}
r = quotes.shift();
quotes.push( r );
return r;
}
window.generateQuote = generateQuote;
}()
</script>
</head>
<body>
<textarea id="quoteBox" readonly></textarea>
<button onClick="document.getElementById('quoteBox').value = generateQuote()">Entertainment & Hobbies</button>
</body>
调用generateQuote()27次的结果:
2,9,7,5,8,1,3,4,6,9,6,1,7,5,4,3,2,8,3,1,6,5,2,7,9,4,8,2
正如您所看到的,在一个完整周期之后,报价再次被洗牌,如果它在最后一个周期中是最后一个并且在新周期中是第一个,则有可能出现相同的报价。它应该比我的mp3播放器中的播放列表改组要好得多:P
答案 2 :(得分:0)
使用
var lastQuote=-1;
在你的职能之外,然后
var rdmQuote=lastQuote;
while (rdmQuote==lastQUote) rdmQuote=Math.floor(Math.random()*aquote.length);
lastQuote=rdmQuote;
你的职能
答案 3 :(得分:0)
你可以调整dontRepeatUntil来满足你的需求 肯定有更好的方法,但这个应该有效
var latestQuote = []
, dontRepeatUntil=3
, rdmQuote = null
, quotes=[
"\"Quote0\""
,"\"Quote2\""
,"\"Quote3\""
,"\"Quote4\""
,"\"Quote5\""
,"\"Quote6\""
]
;
function GenerateQuote(){
if(latestQuote.length >= dontRepeatUntil){
latestQuote = latestQuote.slice(latestQuote.length-dontRepeatUntil+1);
}
do{
rdmQuote=Math.floor(Math.random()*quotes.length);
}while(latestQuote.join(',').match(new RegExp('(^|,)'+rdmQuote+'(,|$)')));
latestQuote.push(rdmQuote);
document.getElementById("quoteBox").value=quotes[rdmQuote];
}