配列をランダムな順序で並べ替える方法を理解しようとしています。だから、私は次のコードを見つけました:
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
私の主な質問は、なぜ.5ではなく他の数?そしてそれが実際にどのように動作するかシンプルにするようにしてくださいjavascriptが初めてで、これらのことに苦労しています
使いました
_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);
_
Math.random() は、_0
_と_1
_(排他的)の間の数を返します。 _0.5
_を使用しているのは、それが平均値であるためです。
Array.sort() は、戻り値に基づいてパラメーターをソートします。したがって、0.5 - Math.random()
は、等しい確率で正または負の値を生成します。したがって、パラメータをランダムにソートします。
Array.sort()
の戻り値がpositiveの場合、最初のパラメーターのインデックスはhigherになります2番目のものよりも。0
_の場合、何もしません。Math.random()0から1(0を含む)の間のランダムな値を返すただし、1は除外されます)。したがって、0.5は中間点として機能します。使用する場合、1より大きいまたは0より小さい値を使用すると、常にtrueまたはfalseになります。そのため、0.5が使用されます。
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:-
上記のすべての条件から出力を印刷してみてください。最後の2つの条件が関数から常にtrueまたはfalseを返すことがわかります。そのため、ランダムな並べ替えは行われません。
ここで、0から0.99までの任意の値を使用できますが、どの値でも使用できますが、0.5が目的に最も適しています。
開始位置近くの要素をランダムにナッジする場合は、sort
をrandom
と一緒に使用してください。ただし、ほとんどの場合、これは望みのものではありません。配列を完全にシャッフルし、すべての要素の位置を完全にランダム化します。また、組み込みの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;
}
_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の間の数を与えます
関数パラメーターでsort
メソッドを呼び出すと、数回呼び出されます。この関数は2つのパラメーターを受け入れます(最初のAと2番目のBを呼び出しましょう)毎回値を返す必要があります:
したがって、この例では、負の値と正の値を均等に分散するランダムな戻り値が必要です。 Math.random()
は0〜1の値を返すため、0.5 - Math.random()
は-0.5〜0.5の値を返し、要件を満たします。