web-dev-qa-db-ja.com

ランダムな順序で配列を並べ替える

配列をランダムな順序で並べ替える方法を理解しようとしています。だから、私は次のコードを見つけました:

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);

私の主な質問は、なぜ.5ではなく他の数?そしてそれが実際にどのように動作するかシンプルにするようにしてくださいjavascriptが初めてで、これらのことに苦労しています

13

使いました

_var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);
_

そしてここで最も重要なことas.sort(func)です。 func(a,b)は、_[-0.5,0.5]_の範囲の値を返します。

この関数は0.5 - Math.random()を返し、Math.random()は_[0,1]_の範囲にあるfloat値を返すためです。したがって、funcは_[-0.5,0.5]_の範囲の値を返します。

これは、ソート順序がincreaseまたはdecreaseに設定されることを意味します。これはランダムです。結果はランダムになります

_var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return Math.random();
}  

console.log(s);_
_var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0 - Math.random();
}  

console.log(s);_
_var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);_
8
Jin

Math.random() は、_0_と_1_(排他的)の間の数を返します。 _0.5_を使用しているのは、それが平均値であるためです。

Array.sort() は、戻り値に基づいてパラメーターをソートします。したがって、0.5 - Math.random()は、等しい確率で正または負の値を生成します。したがって、パラメータをランダムにソートします。

仕組み

  • Array.sort()の戻り値がpositiveの場合、最初のパラメーターのインデックスはhigherになります2番目のものよりも。
  • negativeの場合、2番目のパラメーターのインデックスは最初のパラメーターのインデックスよりもhigherになります。
  • そして、_0_の場合、何もしません
10
rv7

Math.random()0から1(0を含む)の間のランダムな値を返すただし、1は除外されます)。したがって、0.5は中間点として機能します。使用する場合、1より大きいまたは0より小さい値を使用すると、常にtrueまたはfalseになります。そのため、0.5が使用されます。

Math.random()について詳しくはこちらをご覧ください

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random

例でもう少し理解しましょう

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);

これは、1より大きい値を使用した場合に得られるものです

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 1 - Math.random();
}  

console.log(s);

これは、0未満の値を使用すると発生します

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return -1 - Math.random();
}  

console.log(s);

P.S:-

  1. 上記のすべての条件から出力を印刷してみてください。最後の2つの条件が関数から常にtrueまたはfalseを返すことがわかります。そのため、ランダムな並べ替えは行われません。

  2. ここで、0から0.99までの任意の値を使用できますが、どの値でも使用できますが、0.5が目的に最も適しています。

5
Code Maniac

開始位置近くの要素をランダムにナッジする場合は、sortrandomと一緒に使用してください。ただし、ほとんどの場合、これは望みのものではありません。配列を完全にシャッフルし、すべての要素の位置を完全にランダム化します。また、組み込みのrandom関数のsortは、初期状態に偏っているため、「シャッフルされた」配列の要素が近くにとどまる傾向があるため、ひどい習慣です。それらの位置(先頭近くにあったものは、先頭近くに留まる可能性が高いなど)。配列が大きくなるほど、シャッフルされる量は少なくなります。

証拠は次のとおりです。 シャッフルにJavaScript Array.sort()メソッドを使用するのは正しいですか?

そして、これは私がほとんどの時間使用する配列をシャッフルするための関数です。すべての要素の位置を徹底的にランダム化します。

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;
}
1
Kresimir

_Math.random_は0〜1の数値を返します。

ソート関数は、戻り値xを次のように使用します。

  • _x == 0_:同じ値、「どのように」を注文できます

  • _x < 0_:最初のオブジェクトはより小さい 2番目のオブジェクトであるため、ソートされた配列のインデックスは他のオブジェクトのインデックスよりも小さくなります

  • _x > 0_ _x < 0_と同じですが、その逆

_Math.random_は0〜1の数値を返し、負の数値も取得するため、値を減算する必要があります。ここで0.5 - Math.random()は0.5から-0.5の間の数を与えます

1
Vivick

関数パラメーターでsortメソッドを呼び出すと、数回呼び出されます。この関数は2つのパラメーターを受け入れます(最初のAと2番目のBを呼び出しましょう)毎回値を返す必要があります:

  1. A <Bの場合、ゼロ未満
  2. A = Bの場合、ゼロに等しい
  3. A> Bの場合、ゼロより大きい

したがって、この例では、負の値と正の値を均等に分散するランダムな戻り値が必要です。 Math.random()は0〜1の値を返すため、0.5 - Math.random()は-0.5〜0.5の値を返し、要件を満たします。

0
yunzen