2011-10-06 57 views
0

http://koreanwordgame.com/在Safari中,我認爲IE7和8 Math.random()不是隨機的嗎?

在該頁面首先加載4個字到通過Ajax的選項的DIV,然後隨機化用下面的函數的正確答案,將含有該元素的DIV被隨機化作爲參數:

var random = function(r){ 
    r.children().sort(function(a,b){ 
     var temp = parseInt(Math.random()*10); 
     return(temp%2); 
    }).appendTo(r);    
}; 

random($("#option")); 

<div id="option"> 
<div class="option" id="option1" style="background-color: rgb(229, 232, 238); ">light</div> 
<div class="option" id="option4" style="background-color: rgb(183, 190, 204); ">pot</div> 
<div class="option" id="option2" style="background-color: rgb(183, 190, 204); ">garlic press</div> 
<div class="option" id="option3" style="background-color: rgb(183, 190, 204); ">habitant</div> 
</div> 

問題是,在Safari瀏覽器正確的答案總是處於頂端的位置......

而在IE 7和8中,它的位置往往不是最高的位置。

我知道這將有可能通過使用時間戳在那裏或某事,但我努力使其正常工作,使功能「更隨機」。

+1

問題不在於'Math.random()'。這是你的「隨機化」排序功能,它只返回'0'或'1',而不是'-1'。 –

+0

但它在Chrome和Firefox中正常工作,那怎麼回事?老實說,我沒有寫這個函數,只是適應了我的需要 – Tules

+1

你應該真的使用Fisher-Yates shuffle來做這件事,否則你的結果幾乎總是會被加權的。 http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle –

回答

3

的問題不是Math.random()。它的您的「隨機化」排序功能,它只返回01,並且從未有-1。以下是如何在正確的時間間隔[-1. 1],基於MDC's getRandomInt function生成一個隨機INT:

Math.floor(Math.random() * 3) - 1; 

(從getRandomInt(-1, 1)簡化)。


這就是說,作爲@32bitkid,發表了意見正確方式是use a Fischer-Yates shuffle

+0

這是一個勝利的公式,它在Safari和IE中運行得非常漂亮! 謝謝你! – Tules

-1

return(temp%2);令你只01

使用return(temp%4);嘗試這會使你0123

雖然我不知道模數的東西。
這將讓你一個隨機數0和3之間:

Math.floor(Math.random()*4)

因此,所有你需要做的是:

var random = function(r){ 
    r.children().sort(function(a,b){ 
     return Math.floor(Math.random()*4); 
    }).appendTo(r);    
}; 
+0

這不是'sort'函數所需要的。 –

+0

好的,切換到這個功能在IE中給出了更好的結果,但Safari仍然處於頂端。 – Tules

+0

順便說一句,這不是我投票你! – Tules

0

您遇到的部分問題是您如何使用隨機函數。排序函數使用另一個函數來比較列表中的任何兩個元素。排序函數所做的假設之一是,任何兩個元素之間的比較結果都是穩定的和一致的(即,如果一個< b和b一個< c,然後一個< c),並且您的函數違反了這個假設。因此,在這種情況下,排序功能的功能實際上沒有保證。根據實現排序功能的方式(我不知道javascript中使用哪種算法),您很可能不會得到一個真正的隨機順序,其中每個項目可能出現在任何給定的位置。

我能想到的最簡單的解決方案是爲每個想要排序的項目生成一個隨機數,然後通過隨機生成的數字對項目進行排序。這與您的方法不同,比較列表中的任何兩個元素在項目排序時總是會產生相同的結果。

相關問題