2016-05-26 14 views
1
var lst = [/*List of items*/]; 
for (var i = 10; i > 0; i--) { 
    lst.appendChild(lst[Math.random() * i | 0]); 
} 

なぜ "|"インデックスに入っていますか?この機能はリスト 'lst'をシャッフルしますか?Math.random()* i |とは何ですか? 0は意味ですか?

+6

'|'はビット単位のORです。これは、 'Math.random()* i'の浮動小数点結果を整数に切り捨てる「賢い」方法です。 – Blorgbeard

+0

[| " (シングルパイプ)はJavaScriptで行いますか?](http://stackoverflow.com/questions/6194950/what-does-the-single-pipe-do-in-javascript) –

答えて

7

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)まで効果的に減少することに注意してください。

+0

'Math.truc()'はありません。おそらく 'Math.floor()'を意味するでしょうか? – RobG

+0

@RobG Math.trunc()は、正の数の場合にのみMath.floor()に相当します。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc –

+0

* Math.random *は負の数を返しません。以前は* Math.trunc *を見ていなかったので、EMCAScript 2015仕様で検索しました。多分それは完全にロードされていませんでした。 – RobG

1

Math.random()は、範囲が[0, 1)のランダムな浮動小数点を与えます。ループ内でiを掛け合わせると奇妙な値が得られます。 | 0は整数値の部分を返します。 Math.floor(Math.random()*n)は、適用可能と思われる範囲[0, n)の範囲の整数を返します。

Node.appendChild()メソッドは、指定された親ノードの子のリストの最後にノードを追加します。

しかし

与えられた子供は、文書内の既存のノードへの参照である場合には、のappendChild()は、新しい位置に、現在の位置からそれを動かす

ので、あなただけの最初の10個のノードをリストの最後にランダムに配置し直す。

関連する問題