- 締切済み
Math.random がNaNになる理由
ループでMath.random() * a[i] こうするとNaNが返ってきます。なぜでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- amanojaku1
- ベストアンサー率54% (265/488)
>そもそもMath.random() * a[i]自体がループの外で実行してもNaNになってしまうので困ってます。ループの外で実行しているのでMath.random() * 10になっているはずですが、NaNになってしまいます。 プログラムが どうなっているのか分からないと回答のしようがありません。
- amanojaku1
- ベストアンサー率54% (265/488)
>「d3.range(10, 31, 1)」を表示すると > >>10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 > >↑30個ないです。 分かってると思いますが 「a[0]=10」~「a[20]=30」の21個の配列要素が生成されています。 >let i = 0; >while(i < 30){ >arr.push = Math.floor(Math.random() * a[i]) >i++; ↑「a[0]」~「a[29]」までの30個の配列要素にアクセスしてます。 当然「a[21]」~「a[29]」までの配列要素は「undefined」です。
お礼
回答ありがとうございます。 すいません。while(i < 30){の部分は、最初d3.range(1,30,1)としていたためそのままになっていましたが一桁だとMath.randomに乗算してもそのままになってしまうのでrange(10, 30,1)としてたあと忘れてました。 そもそもMath.random() * a[i]自体がループの外で実行してもNaNになってしまうので困ってます。ループの外で実行しているのでMath.random() * 10になっているはずですが、NaNになってしまいます。
- amanojaku1
- ベストアンサー率54% (265/488)
それは あくまでも説明のための一例です。 >「a[i]」が「undefined」だからでしょう。 ↑「a[i]」が問題だと言う事です。 「d3.range(10, 31, 1)」を表示すると >10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 ↑30個ないです。
- amanojaku1
- ベストアンサー率54% (265/488)
「a[i]」が「undefined」だからでしょう。 i=0; a = Array(); ↑例えば、この場合、まだ「a[0]」には何も代入されておらず「a[0]=undefined」です。 i*a[i] ↑例えば、このように「i」(数値)と「a[i]」(undefined)を乗算(または除算)すると「NaN」になるようです。
お礼
回答ありがとうございます。 d3.jsを使っています。 コードは以下です。 let arr = []; let a = d3.range(10, 31, 1); let i = 0; while(i < 30){ arr.push = Math.floor(Math.random() * a[i]) i++; } console.log(arr) 変数aは間違いなく配列が入っています。a[0]としてみてもちゃんと値が取り出せます。ですが、Math.random() * a[i]こうするとやはりNaNになってしまいます。 なにかささいな間違いをしてると思うんですが...
- notnot
- ベストアンサー率47% (4900/10358)
a[i] がNaNなのでしょう。
お礼
回答ありがとうございます。 d3.jsを使っています。 コードは以下です。 let arr = []; let a = d3.range(10, 31, 1); let i = 0; while(i < 30){ arr.push = Math.floor(Math.random() * a[i]) i++; } console.log(arr) 変数aは間違いなく配列が入っています。a[0]としてみてもちゃんと値が取り出せます。ですが、Math.random() * a[i]こうするとやはりNaNになってしまいます。 なにかささいな間違いをしてると思うんですが...
お礼
本当にばかげた間違いでしたorz お付き合いいただきありがとうございました。