私の推測では、問題はあなたのrandnum
方法にあると思います:
function rand(min, max){
return (Math.floor(Math.random() * (max - min + 1)) + min).toFixed(0);
}
これにより、両端を[min, max]
含む範囲の値が得られると思います。(実際には、文字列を返すようにその値の文字列バージョンが提供されますが、後で使用すると、強制的に数値に戻されます。)toFixed
今、あなたはそれをこのように呼んでいます:
num = rand(1,chamarr.length);
したがって、配列の長さが6要素の場合、範囲内の値を取得します[1, 6]
。しかし、次に、-を取得しようとします。chamarr[num]
有効なインデックスの範囲は[0, 5]
、配列が0ベースであるためです。要素6を取得しようとすると、それで得られますundefined
が、要素6でスプライシングしても何も起こりません。
rand
次のように、メソッドを上限で排他的に変更します。
function rand(min, max) {
return (Math.floor(Math.random() * (max - min)) + min).toFixed(0);
}
そしてそれをこのように呼びます:
num = rand(0, chamarr.length);
これにより、インデックス作成とスプライシングの両方に適切な範囲の値が得られます。
編集:コメントなどに応じて:
関数のtoFixed(0)
一部を削除することはおそらく価値があります。結局のところ、文字列は本当にrand
必要ありません。これは実際には以前の問題の一部ではありませんが、一般的にはよりクリーンです。
function rand(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
0
下限を暗黙的にする関数のバージョンが必要な場合もあります
- コード内の他の場所で乱数を使用しない場合は、個別の関数を使用する代わりに/呼び出しをインライン化できますが、個人的には、取得したい「ロジック」コードからそれらを十分に遠ざけたいと思います。乱数を使用します。
Math.floor()
Math.random()
- 関数を変更する理由は、排他的な上限を持つことがコンピューターサイエンスでははるかに一般的であるためです。これは通常、コレクションなどの0インデックス付けと一緒に行われます。通常
for
、包括的下限と排他的下限などを使用してループを記述します。