質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

4249閲覧

乱数の扱い(複数のクラス間で使用したい場合)

panazuso

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/12/29 10:46

java初心者です.乱数について質問いたします.

現在,javaで乱数を使うシミュレータを作成しています.結果を分析する際に再現性が必要なため,
1回のシミュレーションごとにシードを設定して発生させる乱数を調整できるようにしたいです.

mainメソッドのシミュレーションを繰り返すfor文の中で,1試行ごとにRandomクラスのインスタンスを作りシードをセットしているのですが,mainのクラス以外のクラスでも乱数を利用したい場合,クラスごとにRandomクラスのインスタンスを作成するのでしょうか.それともmainクラスで一度インスタンスを作成し,mainクラス名.インスタンス名.nextInt()のようにやるのでしょうか.

eclipseでエラーが出て実行できないので,回答よろしくお願いいたします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

mainクラス名.インスタンス名.nextInt()のようにするのであれば、そのインスタンスをstaticに指定する必要があります。

java

1import java.util.Random; 2 3class Main { 4 //staticフィールドでrandomを宣言 5 public static Random random; 6 7 public static void main(String[] args){ 8 for(i = 0; i < 10; i++){ 9 //シード設定したRandomをstaticフィールドに設定 10 random = new Random(10); 11 int i = new OtherClass().method(); 12 } 13 } 14} 15 16class OtherClass { 17 18 public int method(){ 19 //Mainクラスのstatic変数を参照して乱数を発生 20 return Main.random.nextInt(); 21 } 22 23}

そうせずに使い回すなら、他クラスのメソッドを起動するときにRandomインスタンスを渡す必要があります。

java

1import java.util.Random; 2 3class Main { 4 5 public static void main(String[] args){ 6 for(i = 0; i < 10; i++){ 7 //シード設定したRandomを生成 8 Random random = new Random(10); 9 int i = new OtherClass().method(random); 10 } 11 } 12} 13 14class OtherClass { 15 16 //Randomインスタンスを受け取り、そのインスタンスから乱数を生成させる 17 public int method(Random random){ 18 return random.nextInt(); 19 } 20 21}

投稿2015/12/29 13:49

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

panazuso

2015/12/30 06:37

回答ありがとうございます.なるほど,メソッドのたびにRandomクラスのインスタンスを受け渡すよりはstaticにした方が楽な気がします.もうひとつ質問なのですが,mainクラスの中でRandomのインスタンスを作成しシードを与えて,他のクラスでメソッドを使うときにRandom.getInstance().nextIntのようにやるとmainでインスタンスを作った意味がなくなりますか? シングルトンというのに関する理解があいまいなのでよろしくお願いいたします.
swordone

2015/12/30 08:20

「渡す」といってもインスタンス自体を渡しているわけではなく、「インスタンスがある場所」を教えていると考えたほうが適切です。 シングルトン設計を考える場合、そのクラスのコンストラクタが外部から呼び出せない(private)状態であることが前提です。そのクラス唯一のインスタンスをクラスのstatic変数に保持し、getInstance()のような取得メソッド経由でそのインスタンスへのアクセスを得るというのがシングルトン設計の基本思想です。 Randomクラスのように標準APIでそれを考えるのは適切ではないと思います。どういう設計でRandomクラスを使うのかわからないのでこれ以上はなんとも言えませんが。
panazuso

2015/12/31 06:29

「渡す」という言葉の概念を少し勘違いしていたような気がしました.これが参照型というものの考え方なのでしょうか?参考になりました,ありがとうございます!
guest

0

シード値を与えて乱数を生成するのであればインスタンスは一つにした方が良いと思います。
その際、メインクラスの変数にアクセスするのではなく、乱数を使用するクラスにインスタンスを渡のがいいのではないのでしょうか。

投稿2015/12/29 11:14

Tokikusa

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

panazuso

2015/12/30 06:30

回答ありがとうございます.「乱数を使用するクラスにインスタンスを渡す」というのは,乱数を使用したいところで「ランダムクラス名.getInstance().nextInt()」とやるのは別のことでしょうか? getInstance()メソッドはインスタンスを一つしか作りたくない場合に使うと分かったのですが,これではmainクラスでシードを設定する意味がないでしょうか?
Tokikusa

2015/12/30 12:51

getInstance()はクラスの設計者がそのクラスのインスタンスを一つだけに制限したい時に実装するメソッドです。JavaのRandomクラスはその様な設計にはなっていません。 Mainクラスでnewしたインスタンスを、static変数に保持するか使用するクラスに引数で渡すかのどちらかになるでしょう。
panazuso

2015/12/31 06:27

なるほどー,参考になりました,ありがとうございます!
guest

0

いくらでもやりようがあります。

  • コンストラクタで渡す。
  • 何個も作る。
  • 適当なクラスに持たせて、そいつを通じて値を取得する。

webでjava組んで実行出来るサービスもあるので
ちょっとした実験ならそういうサイトでやるのもありです。

投稿2015/12/29 11:04

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

panazuso

2015/12/30 06:41

回答ありがとうございます. 初めてやってみましたが便利ですね! 利用してみます,ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問