プロが教える店舗&オフィスのセキュリティ対策術

Javaの本を購入し、演習を行いましたが思った以上に理解できませんでした。
例題と演習を記入いたしますので、どなたかご教示くだされば幸いです。
ちなみにですが、本は初心者向けで例題のみで解けるものと思われます。


【例題1】0~9の数値を乱数で生成して表示
import java.util.Random;
public class Lesson2to14 {
public static void main(String[] args) {
Random rand = new Random();

int lucky = rand.nextInt(10);
System.out.println("今日のラッキーナンバーは" + lucky + "です。");

}

}


【演習1】一桁の正の整数値、一桁の負の整数値、二桁の正の整数値をランダムで生成せよ
import java.util.Random;
public class Exercise2to7 {
public static void main(String[] args) {
Random rend = new Random();
int lucky = rend.nextInt(10);
System.out.println("一桁の正の整数値を表示します:" + (lucky + 1));

Random rend2 = new Random();
int lucky2 = rend2.nextInt(9);
System.out.println("一桁の負の整数値を表示します:" + -lucky2);

Random rend3 = new Random();
int lucky3 = rend3.nextInt(90);
System.out.println("二桁の正の整数値をランダムに生成します:" + (lucky3 + 10));
}

}


演習1に関しては例題からなんとなく理解をしてプログラムを組むことができました。(当たってるかは不明です...)
しかし演習2と3については例題1では組めるのか理解できません。



【演習2】キーボードから読み込んだ読み込んだ整数値±5の範囲の整数値をランダムに生成して表示するプログラムを作成せよ。
0~5であればrend.nextInt(6)で簡単にランダム生成できますが、
-5~5の範囲となると例題だけでは何も思いつきませんでした。


【演習3】
-1.0以上1.0未満の実数値をランダムに生成して表示せよ。
上記の場合はnextFloatから生成された数値から-1引けばできると思います。
しかし、例えば-2.0以上10以下など正負の値をランダムで生成する方法が解っていません。
こちらも良かったらご教示お願い致します。

A 回答 (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以下にするには工夫が必要です。
    • good
    • 0
この回答へのお礼

大変参考になりました、ありがとうございますm(_ _)m

お礼日時:2012/10/14 21:28

JAVAのプログラムというより数の概念と「さんすう」の理解を問われる問題です。



演習2
rend.nextInt(11)から5を引いた数を入力値に足す。

これが解れば演習3も自ずと解るはず。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!