アプリ版:「スタンプのみでお礼する」機能のリリースについて

『a~z』の英小文字をランダムで表示させ、さらにint型変数countを『0~9』までランダムに発生させて取得した数だけ『a~z』をランダムに表示させたいのですが、表示結果が(例)aaaaa・・・ となってしまいます。本当は、acyxd・・・とランダムに表示させたいのですがどうすれば、よいでしょうか?
import java.util.*;
import java.io.*;
class CharCheck{
 public char charRandom(){
int n;
char c = ' ';
Random ran = new Random();
while(true){
 n = ran.nextInt(123);
if(n >= 97 && n <= 122){
 c = (char)n;
   break;
}
 }
 return c;
}
public class RandomTest extends CharCheck{
 public static void main(String args[]){
  char ch[] = new char[10];
int count = 0;
CharCheck ChChk = new CharCheck();
Random ran = new Random();
  komoji = ran.nextInt(9);//英小文字をいくつ表示するかランダムで決める? (1以上とする)
if(count == 0){
   count++;
}
for(int i=0; i<count; i++){
ch[i] = ChChk.charRandom();
   System.out.println(ch[i]);
}
}
}

A 回答 (2件)

メソッドcharRandom()を見ると、起動ごとにいちいち


Rondom()を生成しています。
Rondom()が作る乱数は「現在の時刻にあれこれ加工して、
一見ランダムに見える数値を計算していく」ようになっています。
一つのRondom型のオブジェクトでnextInt()を使うのなら、
そのたび別の数値が得られるのですが、
いちいち生成すると、このような計算をする位の短い間では、同じ数値をかえしてきます。

対処法としては、Rondom型のオブジェクトranを、
どっちかのクラスのフィールドとして初期化し、
(つまり、メソッドの外側で
Rondom ran = new Rondom();
と宣言しておく)
同じranをmainやcharRondomで使い回しをすればいいのです。

なお、mainの中でCharCheckオブジェクトを生成する必要はないと思います。
(さもなければ、CharCkeckを継承する必要はないと思います。
どちらかが不必要ではないでしょうか)
    • good
    • 0
この回答へのお礼

クラスのヒィールドの外に宣言したらうまく結果を得ることができました。ありがとうございます。

お礼日時:2003/03/02 15:06

問題点は #1 さんが回答されているので、簡単なロジックを。



Random random = new Random(); //これを使いまわす
int count = random.nextInt(10) + 1 ; //カウンタ変数 1-10
char[] c = new char[count]; //出力用文字配列
for(int i=0 ; i<count ; i++ ){
c[i] = (char)(random.nextInt('z'-'a'+1) + 'a');
}
System.out.println(c);

上記の 'z'-'a'+1 は、アルファベット総数の26としても構わないのですが、何をしようとしているのかを明示的にする為にこうしました。
    • good
    • 0

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