2011-07-10 11 views
0

作成中のゲームの場合:HTML5 <audio>要素1個とJavaScriptを使用して、ランダムキーをオブジェクト(配列になります)から選択するプレイリストを作成しようとしています。 。選択されたオブジェクトは、プレイヤーの状態の「気分」に基づいています。次に、ArrayからソングのソースURLを抽出し、選択したソングがまだ再生されていない場合はロードしてから再生します。次のようにplay機能がある(オブジェクトリテラルの一部である):「ランダム」配列の操作

play: function(option) { 
    if (G.audio.enabled) { 
     var player = G.audio.player, 
      playlist = G.audio.playlist; 

     if (option && G.audio.playlist[option]) { 
      G.audio.mood = option; 
      var song = playlist[option][Math.floor(Math.random() * (playlist[option].length))][2]; 
      if (G.audio.current != song) { 
       G.audio.current = song; 
       player.attr("src", song); 
       player[0].load(); 
       player[0].play(); 
      } else { 
       G.audio.play(G.audio.mood); 
      } 
     } else { 
      G.audio.play(G.audio.mood); 
     } 

     try { 
      player[0].removeEventListener("ended", G.audio.play); 
     } catch (e) {} 
     player[0].addEventListener("ended", G.audio.play); 
    } 
} 

ですから、例えば、私たちは(気分で)「英雄」のカテゴリを扱う(そして唯一持っていた)された場合には、G.audio.playlist次のようになります。最初にしながら、2曲目はほとんど果たしていないと第三は、通常負荷時に再生するものです:

heroic: [ 
    [ 
    "Song Title", 
    "Artist", 
    "Source url", 
    "other info" 
    ], 

    [ 
    "Song Title", 
    "Artist", 
    "Source url", 
    "other info" 
    ], 

    [ 
    "Song Title", 
    "Artist", 
    "Source url", 
    "other info" 
    ] 
]; 

すべてが一つのことを除いて、正常に動作します。

playlist[option][Math.floor(Math.random() * (playlist[option].length))][2]; 

は、配列の最初の([0])と第3キー([2])への優先権を与えるだろう:

だから、私の質問は、なぜ上の任意の論理的な推論はありますか?

+0

バイアスはありますか?乱数生成用のコードはうまくいきます... – emboss

答えて

2

this jsfiddleを試して、numRumsを最大値に設定してください。意味のある偏見はなく、実行するたびに異なる結果になります。パーセント表示は、予想される平均値のパーセント値です。私は十分な走行で約0.01%の変化を見る。

more advanced jsfiddleここでは、実行中のスクリプトの長さに不満を抱かせることなく、多くの反復を任意の回数実行できます。あなたが望むならば、文字通り1億回の反復を実行できます。これは、3つのバケットで10億回の繰り返しを実行することによって得られたものです。

Number of Cycles Executed: 1,000,000,000 
333,317,410 (-0.004777%) 
333,330,202 (-0.000939%) 
333,352,388 (+0.005716%)