randomメゾットについての説明

このQ&Aのポイント
  • randomメゾットは0から9までの乱数を生成するメゾットです。
  • Math.random() * 6 + 1 はさいころの目を題にした乱数生成方法です。
  • 疑似乱数や乱数の種類についての説明は理解できない場合もあります。
回答を見る
  • ベストアンサー

randomメゾットについて

(int)(Math.random() * 10)で0~9の乱数が得られます。 この意味が全く理解できません。 乱数をキーワードに検索を続けていくと下記のような投稿を見つけました。 さいころの目を題にしたものがあると思うのですが、 その場合、Math.random() * 6 + 1 と回答されていると思います。 それは、 0~5までの乱数を作成し、作成された乱数に1を加算していて、 乱数:Math.random() * (max - min + 1) + min という計算式を元に考えられているのですよね? ますます意味が分かりません。 どなたか私のような者でも分かるように噛み砕いて説明して頂けないでしょうか? 疑似乱数が何かとか、乱数の種類には何があってとか説明されても分からないと思います。 まずは上記の内容について説明頂きたいです。くだらない質問ですみませんが宜しくお願い申し上げます。

  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • yaguma
  • ベストアンサー率57% (4/7)
回答No.2

Math.random()メソッドは、0.0以上1.0未満のdouble値を返します。 例えば、 int x = (int)Meth.random(); と書くと、xは必ず0になりますよね。random()メソッドの戻り値は、0から限りなく1に近い0.99999...の範囲のdouble値なので、int型にキャストすると小数点以下は切り捨てられ、0になってしまいます。 int x = (int)(Math.random() * 2); と書くと、xは必ず0か1になります。random()メソッドから返ってくる0~0.9999...の値に2をかけると、0~限りなく2に近い1.999...の範囲の値が得られますよね。 ということは、それをintにキャストすると、小数点以下が切り捨てられて0か1になるというわけです。 では、これはどうでしょうか。 int x = (int)(Math.random() * 6); 0.0以上1.0未満の値に6をかけると、0~限りなく6に近い5.999...というdoule値が返されます。それをintにキャストすると、もうおわかりかと思いますが、0~5の値が得られます。 0~5の値が得られるということは、それに1を足せばサイコロの目を表現できますね。 (int)(Math.random() * 6 + 1); //(int)((Math.random() * 6) + 1); このように、0~5.999...の値に1を足せば、1~6.999...の値を得ることができます。それをint型にキャストすれば、1~6の値になるということです。 少し説明がくどくなりましたね。申し訳ないです。

inuoyogi7
質問者

お礼

yagumaさん、ご丁寧に説明して頂いてありがとうざいます。説明がくどくて申し訳ないなんてとんでもないです。本当に分かりやすい説明でおかげで私の様な者でも十分に理解することができました。yagmaさんには感謝×2です。ありがとうございました。

その他の回答 (1)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

> 私のような者でも分かるように 私エスパーじゃないから あなたがどんな人なのか分らないわ。 なのでちょっと噛み砕いて回答してみるわね。 > (int)(Math.random() * 10)で0~9の乱数が得られます。 この処理にはある大前提があるのね。それは ・Math.random()の実行結果が  0~0.999・・・に均一に出現すること。 そうすると次のばらつきが得られるわ。 0~0.09・・・ 0.1~0.19・・・ ~ 0.9~0.99・・・ この10通りのばらつきがそれぞれ1/10の確率で出現するの。 この結果に対し ・(int)は小数点第一位の桁で切り捨てる を行えば 0~9がそれぞれ1/10の確率で得られるわね。 ところで ・Math.random()の実行結果が  0~0.999・・・に均一に出現すること。 の前提は本当に成り立つの?という質問はダメよ。 成り立たなかったらそもそもこのメソッドの不具合ってことになるから。 同じような感じで Math.random() * 6 + 1 もそう。 0~0.16・・・ 0.167・・・~0.33・・・ ~ と言う感じで それぞれが1/6の確率で発生するのよ。 10は6で割り切れないって言いたい? 非連続な整数の世界ではそうなんだけど 連続した無限小数の世界では10は6で割り切れてしまうの。 こういう数学のお話は難しいかもしれないけど そういうもんなんだってしぶしぶ納得して欲しいな。 連続な世界を解説しだすと本1冊じゃ足りないのよ。 ちょっと消化不良だけどこんな答えで大丈夫かな?

inuoyogi7
質問者

お礼

回答ありがとうございます。 Math.random() * 6 + 1もそう。 0~0.16・・・ 0.167・・・~0.33・・・~ 私には正直、まだこの文の意味がよく理解できません。 しかしながら疑問は解決できました。ありがとうございました。

関連するQ&A

  • random()関数について

    random()関数で、擬似乱数を1000個発生させる intx; x=random()% 10000; /*0-9999の擬似乱数1個をxに代入*/ これの比較回数を求めたいのですが↑のx=random()%の%の意味とその後の10000という数字の意味がわかりません;; ↑の文を解りやすく説明していただけるとありがたいのですが^^;

  • ランダム数をピックアップする方法

    いつもお世話になります。 このサイトで1から20までの中から重ならないように 3つ選ぶ問題で、以下のような説明を見つけたのですが、 どうしても、この通りにするコードが組めません。 先週の金曜日から考えているのですがどうしてもできません。 どなたか教えてください。 元の回答はここにあります。NO.1の方です。 http://okwave.jp/qa2035910.html ▽▽▽▽▽▽▽▽▽引用▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽ Math.random()を使うと、0以上1未満の乱数が生成できます。 これを使って、 20*Math.random() とすると、0以上20未満になります。 20も含めたいので、これに1を足します。 20*Math.random() +1 これで出てきた数字を変数に入れておき、もう一回この関数を呼び出し、変数に入っている数が出てきたらもう一回呼び出します。 ユニークな乱数が3つ生成されたら、完了です。 コードは工夫してみてください。

  • 乱数について

    MathクラスのRandomメソッドを使用して、hairetu[i] = (int)(Math.random() * 100);のように乱数を取得しているのですが、このMath.randomについても、平均を取ると大体、真ん中の50になる等の特徴があるかもしれません。一様乱数と標準正規乱数が関係するのでしょうか?この2つの違いについて教えてください(^^;

    • ベストアンサー
    • Java
  • 意味がわかりません

    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
  • ランダムに数字を並び変える方法は

    windows2000 Flash MX 1~9までの数字をランダムに発生させ配列に入れるには v_count=new Array(); for(i=1; i<10; i++) {   v_max=9   v_count[i]=Math.floor(Math.random()*v_max)+1  } と記述しました。 配列に格納されたランダムに発生した数字が9個ありますが当然同じ数字も含まれています。 これを数字が重複しないようにする方法が知りたいのです。 つまり1~9までの数字をランダムに並べ替えたいのですがどのような方法がありますか。教えて下さい。 説明が下手でスミマセン。 ご指摘いただければ補足します。

    • ベストアンサー
    • Flash
  • エクセルで「乱数」を出す@関数は?

    「1-2-3」では、乱数を出す関数は「@INT(@RAND*400)+1」で1~400の間のアットランダムな乱数をさながらサイコロのように出すことが出来るのですが、エクセルではそういう関数があるのでしょうか? 是非教えて下さい。

  • コンパイルできません。

    コマンドプロンプト上で、乱数をいくつか取得するというプログラムを作成したいのですが、コンパイル出来なくて困っています。発生させる乱数を0~900までの数字の中から0~9個のうちのいずれかの個数だけ取得するようにしたいです。j< の所に変数を記述するのはダメなのでしょうか?わかる方いましたらお願いします。 import java.util.*; public class RandomTest{ int rand; public static void main(String[] args){    Random generator = new Random();    for(int i=0; i<1; i++){     int rand = (int)(Math.random() * 10);    }    for(int j=0; j<rand; j++){     int ran = (int)(Math.random() * 1000);       System.out.println(ran);    } } }

    • ベストアンサー
    • Java
  • 0から99の数字をランダムに並び替えたいのですが・・

    0から99までの数字をランダムに並び替えて、  89 42 19 35 2 94 12 .... のような数字の列を得たいのですが、どうすればよいでしょうか?一見、簡単そうなのですが、つまずいています。 最初思いついたのは次の方法です。 以下を i=0 から i=99になるまで繰り返す。 (1) tmp = (int) 100 * Math.random(); と 0~99の乱数を発生させる (2) a[0]~a[i-1]の中にxと同じ値が無ければ a[i] = x;と代入。同じものがあったら (1)に戻る。 (3) i = i+1; この方法だと、i=98の時は、ほとんどの場合「a[0]~a[i-1]の中にxと同じ値がある」ことになってしまい、iが増えるごとにスピードが落ちます。 100個くらいの数字なら良いのですが、100000000個の数字だと非効率な気がします。 みなさんどうなさっているのでしょうか?

    • ベストアンサー
    • Java
  • 最大値をもとめる

    Math.randomで100個の乱数を発生させてから、その中の最大値求めたいのです。一応JAVAの初心とのことでMAX関数を使わずにプログラムを書きたいです。どなた教えてください。

  • java(バブルソート/単純挿入ソート)

    以下のプログラムを「バブルソートもしくは単純挿入ソートのプログラムに変更しなさい」という課題が出ました。 どのようにすればよろしいでしょうか? import java.util.*; public class SelectSort { //プログラムクラス名 //整列プログラム public static void main(String[] args){ //整列用 int 型配列 int[] target; int elems = KeyboardInput.askInt("要素数? "); //配列を乱数で初期化する target = setArray(elems); //初期状態を表示 display(target); //整列メソッドの呼び出し sortArray(target); //整列結果の表示 display(target); } //配列を乱数で初期化するメソッド static int[] setArray(int elems){ // 要素数個の int 型変数の確保 int[] array = new int[elems]; //乱数利用ための宣言 Random generator = new Random(); //乱数の最大値・最小値 int max = 100; int min = 0; //generator.nextDouble() で 0から1までのdouble型乱数発生 for(int i=0 ; i<array.length ; i++) { array[i] = (int)((max-min)*(generator.nextDouble())+min); } return array; } //配列の状態を表示 static void display(int[] array){ for(int i=0 ; i<array.length ; i++) { System.out.print(array[i]+" "); } System.out.println(""); } static void sortArray(int[] array){ //配列のはじめから最後まで繰り返す for( int i = 0; i < array.length-1 ; i++){ int min_id = i; int min = array[i]; //範囲中でもっとも小さい要素を探す for( int j=i+1 ; j< array.length ; j++ ) { if( array[j] < min ){ min = array[j]; min_id = j ; } } //範囲の始めと置き換える int tmp = array[i]; array[i] = array[min_id]; array[min_id] = tmp; //display(array); } } }

専門家に質問してみよう