• 締切済み

Randomクラスについて

Random rand = new Random(); int random = rand.nextInt() % 7; 上記のようにランダムクラスのインスタンスを作成し 0~7までの均等な値をfor文を使って得たいのですが、 なぜかrandomの中にマイナスの値が入ってしまいます。 なぜでしょうか?あるいはこれ以外に回避できる方法は ありますか?

  • Java
  • 回答数4
  • ありがとう数13

みんなの回答

  • syunpon
  • ベストアンサー率42% (9/21)
回答No.4

ありゃ?出来ませんでしたか? 一応、私の環境で実験してみましたんですけど、特に問題無かったんですが。。 ちなみに私はJDK1.3でDOSプロンプトからコンパイル&実行です。 一応簡単なサンプルを載せておきますね import java.util.Random; class RandomPrint { public static void main(String args[]) { Random rand = new Random(); for ( int i = 0; i <10; i++){ int random = rand.nextInt(8); System.out.println(random); } } } ちなみに前に記したURLはJDK1.2のクラスライブラリの仕様なので、 それより前のバージョンのJDKだとどうなのかはわかりません。。(^^; 説明書きによるとJDK1.0からの導入らしいので大丈夫だとは思うのですけど。。 もしかして、int random = rand.nextInt(8);の部分を int random = rand.nextInt( 0, 8);とかしてません? でも、これだと「シンボルを解釈実行出来ません」ってエラーになるんですよね。。。(^^;

cyan1110
質問者

お礼

親切にありがとうございました。 とりあえず、今度はJ++を使わないで、参考プログラムを試してみたいと思います。

  • syunpon
  • ベストアンサー率42% (9/21)
回答No.3

ランダムクラスなのですが、nextIntメソッドで0から指定された範囲の一様分布のint型の擬似乱数を返しますので、 質問のような場合は、 int random = rand.nextInt(8); で0~7の擬似乱数が得られますよ 詳しくは、下記参照URL:Sunのクラスライブラリ仕様書参照して下さい インデックス欄をクリック後Rの項目クリックしてスクロールしていけば Randomクラスについて詳しく書かれてあります。

参考URL:
http://www.javasoft.com/products/jdk/1.2/ja/docs/ja/api/index.html
cyan1110
質問者

補足

nextInt()の()の中に数値を入れると引数が多すぎると出ます。リファレンスマニュアルを見ても引数の指定はありませんでした。syunponさんの参考URLで調べてみます。ありがとうございました。

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.2

同じ数字が、近い間できるだけに出ないように するためには、適当におもみ付けをつけて、 同じ数字ははじいてしまえば良いような気がします。 (ゲーム開発の現場などで一見ランダムと見せかけて  本当は裏で工作するときによく使う手法です) 例えば、以下の2つの判定をするだけでも、有効です。 (1)8つのキュー配列を用意し、ランダム値を一回だす  ごとに、このキュー配列に数字を入れます。  そして、新たに数字を振るときに、8つのキュー配列  中にすでに1回その数字がでていれば、30%の確率  で振りなおし、2回その数字が出ていれば、50%の  確率で振りなおす。  長期的に見た場合のランダムを期待するだけではなく、  短期的にもランダムであることを意図的に仕向けるわ  けですね。  %のところは重みづけです。  ご自由にお考え下さい。

noname#9414
noname#9414
回答No.1

マイナスの値が入らないようにしたいのであれば、 単純に、絶対値に変換してから7で割ってはダメ なのでしょうか。 ではでは☆

cyan1110
質問者

補足

試してみたのですが、7回中、同じ値が数回現れます。J++のバグでしょうかね~。

関連するQ&A

  • Randomクラスを使い同じ値をもつことがないように

    するには? サンプルコードをどう改良したらいいですか 例えば{1,3,5,5,3,2}の連続した5とならないようにするには? import java.util.*; class Sample6_9{ public static void main(String args[]){ Scanner std = new Scanner(System.in); Random rand = new Random(); System.out.print("要素数:"); int n = std.nextInt(); int[]a = new int[n]; for(int i=0;i<n;i++){ a[i] = 1+rand.nextInt(10); System.out.println("a["+i+"]="+a[i]); } } }

  • 意味がわかりません

    1から10のうちで乱数を1から10個のうちいずれかの個数を表示する。というプログラムを作成したく、次のようなプログラムを作成したのですが、表示結果に0(何も表示されない)が出てしまい意味がわからなくて困っています。1以上としたのになぜ何も表示されない結果が出るのでしょうか? import java.util.*; public class RandomTest{ public static void main(String[] args){ int rand; Random generator = new Random(); //1以上10以下のintの値をrandに rand = (int)(Math.random()*10)+1; for(int j=1; j<rand; j++){ int ran = (int)(Math.random() * 10)+1; System.out.println(ran); } } } お願いします。

    • ベストアンサー
    • Java
  • Java do while文

    do while文を使って、int num = new Random().nextInt(10);を利用して、ランダム数値が2で割り切れるか0だったらwhile文を終わらせるdo-while文を作成したいのですが、わかりません。わかる方、教えてください。お願いします。

  • javaのプログラム

    int型の配列の各要素に1~10の乱数を代入し、各要素の値を縦向きの*のグラフで表示するプログラムを作っているのですが、結果がランダムででるので、自分の書いたプログラムが正しいのかわかりません。ソースを載せますので合っているのか間違っているか教えて下さい。もし間違っているならどこが間違いなのか教えていただけると嬉しいです。よろしくお願いします。 ●ソース import java.util.Random; import java.util.Scanner; class Graph { public static void main(String[] args){ Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数:"); int n = stdIn.nextInt(); int a[] = new int[n]; for (int i = 0; i < n; i++) a[i] = 1 + rand.nextInt(10); for (int i = 1; i <= 10; i++){ for (int j = 0; j < n; j++) if (a[j] <= i) System.out.print("* "); else System.out.print(" "); System.out.println(); } } } ●実行例 要素数:12 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

    • ベストアンサー
    • Java
  • 乱数の生成について

    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以下など正負の値をランダムで生成する方法が解っていません。 こちらも良かったらご教示お願い致します。

    • ベストアンサー
    • Java
  • java eclipse do-while文

    計算問題のプログラムです。No…0を選択したときにwhile文から抜け出したいです。 抜け出せない原因と解決方法(プログラム)を教えていただけるとありがたいです。 package lesson5; import java.util.Random; import java.util.Scanner; public class MentalArithmetic { static Scanner stdIn = new Scanner(System.in); static boolean confirmRetry(){ int cont; do{ System.out.print("もう一度?<Yes・・・1/No・・・0> : "); cont = stdIn.nextInt(); }while (cont != 0 && cont != 1); return cont ==1; } static void mondai1(){ Random rand = new Random(); do{ int p = rand.nextInt(900) + 100; int q = rand.nextInt(900) + 100; int r = rand.nextInt(900) + 100; while(true){ System.out.println(p + "+" + q + "+" + r + " = " ); int k = stdIn.nextInt(); // if(k == p + q + r) // break; System.out.println("違いますよ!!"); } }while (confirmRetry()); } public static void main(String[] args) { System.out.println("暗算力トレーニング!!"); while (true) { mondai1(); } } }

  • 乱数を発生させて、それを配列して小さい順に並べる

    乱数の発生のさせ方は、質問集で見て import java.util.Random; class ransuu { public static void main(String args[]) { Random rand = new Random(); for ( int i = 0; i <10; i++){ int x = rand.nextInt(9); System.out.println(x); } } } を用いて表示できたのですが、そのあとの配列がよく分かりませんのでぜひ教えてください。ちなみに私の持っているテキストには任意の数(22、80、57、60、50など)を並べ替えるというものはあるのですが、今回のような乱数+配列の例が載っていないのでよく分かりませんでした。

    • ベストアンサー
    • Java
  • 回答が分かりません。どなたかお助けを。

    以下のように Dice クラスがあります。このクラスはサイコロの役目をします。 サイコロの目は Random クラスを継承して擬似乱数を生成しています。 Main クラスでは、Dice インスタンスを2つ生成してサイコロを10回振った結果を コンソールに出力します。 しかし、Dice クラスは Random クラスの nextInt メソッド以外は UnsupportedOperationException をスローして使用していません。 つまり、相続の拒否しているので継承を使用すべき実装ではありません。 Random クラスを継承ではなく委譲を使用した実装に変更してください。 import java.util.*; public class Dice extends Random { // コンストラクタ public Dice() { super(314159L); } public Dice(long seed) { super(seed); } @Override public int nextInt() { // サイの目は最大6で、返される値は0~5なので+1した値を返す。 return nextInt(6) + 1; } @Override public void nextBytes(byte[] bytes) { throw new UnsupportedOperationException(); } @Override public long nextLong() { throw new UnsupportedOperationException(); } @Override public boolean nextBoolean() { throw new UnsupportedOperationException(); } @Override public float nextFloat() { throw new UnsupportedOperationException(); } @Override public double nextDouble() { throw new UnsupportedOperationException(); } @Override public double nextGaussian() { throw new UnsupportedOperationException(); } } public class Main { public static void main(String[] args) { Dice dice01 = new Dice(); Dice dice02 = new Dice(456L); executeDice(dice01); executeDice(dice02); } private static void executeDice(Dice dice) { // サイコロを10回振ります。 for (int i = 0; i < 10; i++) { System.out.printf("%d, ", dice.nextInt()); } System.out.println(); } }

    • ベストアンサー
    • Java
  • javaのクラスなど

    現在次のようなクラスを作成していて、自分なりに作ってはみたもののうまく分かりません。 どこが間違っていてどのように修正したらよいのか、詳しく教えてください。 9と10は分かりませんでした。 (1) 次に示す内容を満たすバー(Bar)クラスを作成せよ。 1. バーの右端のx座標(=バーの長さ)、バーの名前を扱う2つのprivateなインスタンス変数を持つ。 2. バーの総数を扱うprivateなクラス変数を持つ。ただし、 ここでいう総数とは、(1)コンストラクタで作成したもの、(2)代入操作で作成したもの、の両方を含む。 3. 引数無しのコンストラクタが呼び出されてバーオブジェクトが作成されると、そのバーのx座標は0以上400未満でランダムに決定され、名前は文字「A」とランダムに決定された0以上10000未満の整数が連接されたものに決定される。 4. バーのx座標を設定するインスタンスメソッドを持つ。 5. バーの名前を設定するインスタンスメソッドを持つ。 6. バーのx座標を取得するインスタンスメソッドを持つ。 7. バーの名前を取得するインスタンスメソッドを持つ。 8. 作成されたバーの総数を取得するクラスメソッドを持つ。 9. 作成されたバーの総数を1増やすクラスメソッドを持つ。 10. 作成されたバーの総数を1減らすクラスメソッドを持つ。 こちらが作ってみたものです。 class Bar{ private int x; private String name; private int count; private Bar(){ x=0; count=0; name=""; } public void Bar(){ x = (int)(Math.random()*400); name = "A" + (int)(Math.random()*10000); } public void setBar(int bx){ x=bx; } public void setName(String nm){ name=nm; } public void getX(int bx){ } public void getName(String nm){ } public void getCount(int c){ } }

    • ベストアンサー
    • Java
  • JAVAで配列を使って * を縦向きのグラフで表示したいです。

    JAVAの勉強をしています。 このプログラムは配列に乱数を生成して * を 横向きにするプログラムです。 練習問題で、以下のプログラムを書き換えて、* を縦向きのグラフで表示する問題なのですが、解く方法がわかりません。 どなたか答えもしくはヒントを下さい。 よろしくお願いします。 import java.util.Random; import java.util.Scanner; public class Test06_04 { public static void main (String[] args) { Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数 : "); int n = stdIn.nextInt(); //要素数を読み込む int[] a = new int[n]; //配列を生成 for (int i = 0; i < n; i++) { a[i] = 1+ rand.nextInt(10); } for (int i = 0; i < n; i++) { System.out.print("a[" + i + "] : "); for (int j = 0; j < a[i]; j++) System.out.print('*'); System.out.println(); } } }

    • ベストアンサー
    • Java