var lst = [/*List of items*/];
for (var i = 10; i > 0; i--) {
lst.appendChild(lst[Math.random() * i | 0]);
}
なぜ "|"インデックスに入っていますか?この機能はリスト 'lst'をシャッフルしますか?Math.random()* i |とは何ですか? 0は意味ですか?
var lst = [/*List of items*/];
for (var i = 10; i > 0; i--) {
lst.appendChild(lst[Math.random() * i | 0]);
}
なぜ "|"インデックスに入っていますか?この機能はリスト 'lst'をシャッフルしますか?Math.random()* i |とは何ですか? 0は意味ですか?
bitwise OR operator |入力を32ビットの2の補数に変換します。
console.log(1.1 | 0); // 1
console.log(1.9 | 0); // 1
console.log(-1.1 | 0); // -1
console.log(-1.9 | 0); // -1
Math.random() * i | 0
したがってMath.trunc(Math.random() * i)
に等しく、0からまでの範囲で擬似ランダム整数を返す式:これはしばしば(Math.truncより速い())は、ゼロに向かって高速の丸めのために使用されますi - 1
PS:二重ビット否定~~は同じ効果があります。ビット単位の演算子を適用すると、整数オペランドの範囲がNumber.MAX_SAFE_INTEGER(253-1)から最大32ビットの2の補数(2³1-1)まで効果的に減少することに注意してください。
'Math.truc()'はありません。おそらく 'Math.floor()'を意味するでしょうか? – RobG
@RobG Math.trunc()は、正の数の場合にのみMath.floor()に相当します。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc –
* Math.random *は負の数を返しません。以前は* Math.trunc *を見ていなかったので、EMCAScript 2015仕様で検索しました。多分それは完全にロードされていませんでした。 – RobG
Math.random()
は、範囲が[0, 1)
のランダムな浮動小数点を与えます。ループ内でi
を掛け合わせると奇妙な値が得られます。 | 0
は整数値の部分を返します。 Math.floor(Math.random()*n)
は、適用可能と思われる範囲[0, n)
の範囲の整数を返します。
Node.appendChild()メソッドは、指定された親ノードの子のリストの最後にノードを追加します。
しかし
与えられた子供は、文書内の既存のノードへの参照である場合には、のappendChild()は、新しい位置に、現在の位置からそれを動かす
ので、あなただけの最初の10個のノードをリストの最後にランダムに配置し直す。
'|'はビット単位のORです。これは、 'Math.random()* i'の浮動小数点結果を整数に切り捨てる「賢い」方法です。 – Blorgbeard
[| " (シングルパイプ)はJavaScriptで行いますか?](http://stackoverflow.com/questions/6194950/what-does-the-single-pipe-do-in-javascript) –