[英]Sorting an Array in Random Order
我試圖了解如何以隨機順序對數組進行排序。 所以,我找到了以下代碼:
var as = ["max","jack","sam"]; var s = as.sort(func); function func(a, b) { return 0.5 - Math.random(); } console.log(s);
我的主要問題是為什么他們使用0.5 而不是另一個數字? 以及它是如何工作的
你用過
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
Math.random()<\/code><\/a>返回一個介於
0<\/code>和
1<\/code> (不包括)之間的數字。
我們使用
0.5<\/code>因為它是平均值<\/strong>。
Array.sort()<\/code><\/a>根據返回值<\/strong>對參數進行排序。
因此,
0.5 - Math.random()<\/code>將以相等的概率產生正值或負值<\/em>。
因此,它將隨機<\/em>對參數進行排序。
如果Array.sort()<\/code>的返回值為正<\/strong>,則第一個參數的索引將高於<\/em>第二個參數的索引。
<\/li>
而且,如果它是0<\/code> ,那么什么都不做<\/em>。
<\/li><\/ul>"
Math.random()<\/strong>返回0 到 1 之間的隨機值(包括 0,但不包括 1)<\/em><\/strong> 。 所以 0.5 作為中點。 如果使用大於 1 或小於 0 的使用值,那么它將始終為真或假。 因此,因此使用 0.5。
https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Math\/random<\/a>
讓我們通過示例進一步了解它
這是使用大於 1 的值時得到的結果<\/em><\/strong>
當您使用小於 0 的值時會發生這種情況<\/em><\/strong>
PS<\/em><\/strong> :-
嘗試從上述所有條件打印輸出,您將看到最后兩個條件將始終從函數返回 true 或 false。 所以你不會得到隨機排序。
現在談論從 0 到 0.99 的任何值,您可以使用任何值,但 0.5 將最適合您的目的。因為它是一個中間點,您最有可能得到最佳答案。
如果您只想以隨機方式將元素推到其起始位置附近,當然,請使用帶有
random<\/code>的
sort<\/code> ,但在大多數情況下,這不是您想要的。
您想徹底打亂數組,完全隨機化每個元素的位置。
並且對於內置
sort<\/code>函數中的
random<\/code>是一種糟糕的做法,因為它偏向於初始狀態,這意味着“洗牌”數組中的元素將傾向於停留在它們的位置附近(那些靠近開始的元素有停留在起點附近的可能性很高,等等......)。
數組越大,被洗牌的次數就越少。
這是證明: 使用 JavaScript Array.sort() 方法進行改組是否正確?<\/a>
這是我大部分時間使用的洗牌數組的功能。 它徹底隨機化了每個元素的位置。
function shuffle(arr) { // randomly rearanges the items in an array
const result = [];
for (let i = arr.length-1; i >= 0; i--) {
// picks an integer between 0 and i:
const r = Math.floor(Math.random()*(i+1)); // NOTE: use a better RNG if cryptographic security is needed
// inserts the arr[i] element in the r-th free space in the shuffled array:
for(let j = 0, k = 0; j <= arr.length-1; j++) {
if(result[j] === undefined) {
if(k === r) {
result[j] = arr[i]; // NOTE: if array contains objects, this doesn't clone them! Use a better clone function instead, if that is needed.
break;
}
k++;
}
}
}
return result;
}
Math.random
返回一個介於 0 和 1 之間的數字。
排序函數使用返回值x
如下:
x == 0
:相同的值,可以“隨心所欲”訂購
x < 0
:第一個對象小於第二個,因此它在排序數組中的索引將小於另一個
x > 0
與x < 0
相同,但反過來
由於Math.random
返回一個介於 0 和 1 之間的數字,並且我們還想得到負數,所以我們必須減去一些值。 這里0.5 - Math.random()
會給出一個介於 0.5 和 -0.5 之間的數字
如果調用帶有函數參數的
sort<\/code>方法會被調用多次。
這個函數應該接受兩個參數(讓我們調用第一個 A 和第二個 B)每次它應該返回一個值:
小於零,如果A < B<\/code>
<\/li>
等於零,如果A = B<\/code>
<\/li>
大於零,如果A > B<\/code>
<\/li><\/ol> 所以在這個例子中,我們需要隨機返回值來均勻分布負值和正值。 由於Math.random()<\/code>返回的值介於 0 和 1 之間,因此0.5 - Math.random()<\/code>將返回介於 -0.5 和 0.5 之間的值,符合要求。
"
正如其他人所提到的,要回答“如何以隨機順序對數組進行排序”的問題,Array.sort() 函數可以將函數作為參數。
語法<\/strong>:
內部
sort_by_function()<\/code>接受兩個參數(例如:x 和 y)並使用
Math.random()<\/code>返回 -0.5 到 0.5 之間的值,它返回:
負數(-0.5 到 -0.1),如果 x < y<\/li>
- 零 (0),如果 x = y 正<\/li>
- 正數(0.1 到 0.5),如果 x > y<\/li><\/ul>
請記住,如果您不向外部
Array.sort()<\/code>函數傳遞任何內容,它只會按升序<\/em>重新排列\/排序元素,但是,如果您傳入一個函數(作為參數),那么它的行為基於什么內部
sort_by_function()<\/code>返回,因為它交換給定數組的每個元素(通過一次交換兩個元素對)本質上,這種交換是根據內部
sort_by_function()<\/code>返回的內容決定的。
為了實現隨機排序,
Array.sort()<\/code>函數將重新排列\/排序每對元素,如下所示:
- 負值:升序交換,<\/li>
- 零:沒有變化,<\/li>
正值:降序交換。<\/li><\/ul>
示例<\/strong>:
由於沒有人提到使用短 Lambda 表達式,這里有一個示例,說明如何使用 Lambda 表達式來縮短內部參數函數,如下所示:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.