簡體   English   中英

"以隨機順序對數組進行排序"

[英]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>對參數進行排序。

它是如何工作的<\/h3>
    如果Array.sort()<\/code>的返回值為正<\/strong>,則第一個參數的索引將高於<\/em>第二個參數的索引。<\/li>
  • 如果為負數<\/strong>,則第二個參數的索引將高於<\/em>第一個參數的索引。<\/li>
  • 而且,如果它是0<\/code> ,那么什么都不做<\/em>。<\/li><\/ul>"

Math.random()<\/strong>返回0 到 1 之間的隨機值(包括 0,但不包括 1)<\/em><\/strong> 。 所以 0.5 作為中點。 如果使用大於 1 或小於 0 的使用值,那么它將始終為真或假。 因此,因此使用 0.5。

你可以在這里閱讀更多關於 Math.random()<\/h2>

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。 所以你不會得到隨機排序。

  1. 現在談論從 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 > 0x < 0相同,但反過來

由於Math.random返回一個介於 0 和 1 之間的數字,並且我們還想得到負數,所以我們必須減去一些值。 這里0.5 - Math.random()會給出一個介於 0.5 和 -0.5 之間的數字

如果調用帶有函數參數的sort<\/code>方法會被調用多次。 這個函數應該接受兩個參數(讓我們調用第一個 A 和第二個 B)每次它應該返回一個值:

  1. 小於零,如果A < B<\/code><\/li>
  2. 等於零,如果A = B<\/code><\/li>
  3. 大於零,如果A > B<\/code><\/li><\/ol>

    所以在這個例子中,我們需要隨機返回值來均勻分布負值和正值。 由於Math.random()<\/code>返回的值介於 0 和 1 之間,因此0.5 - Math.random()<\/code>將返回介於 -0.5 和 0.5 之間的值,符合要求。

    "

最短形式(使用 Lambda 表達式):<\/h1>

正如其他人所提到的,要回答“如何以隨機順序對數組進行排序”的問題,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.

相關問題 打字稿數組排序與隨機排序順序 在 javascript 中按升序對隨機生成的數組進行排序的問題 排序數組並保持順序 以隨機順序打印數組? JavaScript數組按給定順序排序 根據數組順序對div排序 根據另一個數組的順序對數組進行排序 按升序排序 2 個數組 javascript 按特定順序對對象數組進行排序 按數組順序對li項進行排序
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM