- ベストアンサー
乱数の生成についての質問
- Javaの本を購入し、演習を行いましたが理解できなかったので質問します。
- 例題1では乱数の生成を学びましたが、演習2と演習3がわかりません。
- 具体的には、演習2ではキーボードから読み込んだ整数値の範囲で乱数を生成する方法がわかりません。演習3では正負の値をランダムで生成する方法がわかりません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「例題だけわかる」なんて思わないで、ちゃんとマニュアルで仕様を確認しましょう。 また、少しだけ算数の復習も必要です。 Random.nextInt(n)は、 0≦x≦n-1 となる整数の乱数xを返します。 だから、例題では > int lucky = rend.nextInt(10); が「0~9の乱数」になるのです。 ここで、算数のおさらいです。 不等式の各辺に同じ値を足しても、大小関係は変化しなかったですよね? a≦x≦b の各辺に-aを足すと 0 ≦ x-a ≦ b-a になります。 y = x-a m = b-a +1 と置くと 0 ≦ y ≦ m - 1 つまり、 y=nextInt(m)で 0~m-1の乱数を発生させれば y=x-a x=y+a で、xが求められます。 > int lucky = rend.nextInt(10); > System.out.println("一桁の正の整数値を表示します:" + (lucky + 1)); 先程のように、nextInt(10)は0~9の乱数です。 0≦lucky≦10-1 です。では、lucky+1の範囲はどうなるでしょう? 各辺に1足すと 0+1≦lucky+1≦10-1+1 ∴1≦lucky+1≦10 10は2桁の整数ですよね? > int lucky2 = rend2.nextInt(9); > System.out.println("一桁の負の整数値を表示します:" + -lucky2); 0≦ lucky2 ≦8 です。不等式の各辺の負の値を掛けると、大小関係が反転しましたよね? -8≦ l-ucky2 ≦0 0は負ではないし、-9が範囲外です。 方法は2つあって、一つは上で書いた式を使って、a=-9,b=-1として計算するもの もう一つは、1~9の乱数の計算方法がわかっているのですから、単純にそれを正負反転させるものです。 > 【演習2】 上の式を使えばいいです。 これも2つ方法があって 一つは、 a=入力-5,b=入力+5とするもの もう一つは、 a=-5,b=+5にして、求めた乱数に「+入力値」するものです。 nextFloatから任意の範囲の実数乱数を求める方法も、基本は一緒で、不等式を変形していきます。 a≦x<b の乱数を求めるなら、まず-aします 0.0≦x-a<b-a a<bなので、 b-a>0ですから、b-aで割っても大小関係は変化しません。 0.0≦(x-a)/(b-a)<1.0 y=(x-a)/(b-a) とすれば、 0.0≦y<1.0 ですから、nextFloatの範囲と一致します。 yが決まったら x=(b-a)*y + a でxが求まります。 > -1.0以上1.0未満の実数値をランダムに生成して表示せよ。 > 上記の場合はnextFloatから生成された数値から-1引けばできると思います。 nextFloat は 0.0≦x<1.0の乱数です。-1すれば -1.0≦x-1.0<0.0 です。-1.0以上1.0未満にはなりません。 > -2.0以上10以下 両方とも=を含む、だとちょっとやっかいです。nextFloatは、「1.0を未満」なので、単純に使ったら、上限か下限のどちらかは=を含みません。 a以上b以下にするには工夫が必要です。
その他の回答 (1)
- TooManyBugs
- ベストアンサー率27% (1472/5321)
JAVAのプログラムというより数の概念と「さんすう」の理解を問われる問題です。 演習2 rend.nextInt(11)から5を引いた数を入力値に足す。 これが解れば演習3も自ずと解るはず。
お礼
大変参考になりました、ありがとうございますm(_ _)m