• ベストアンサー

乱数について

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

  • mos21
  • お礼率46% (128/273)
  • Java
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

一様乱数の場合、 平均を取ると、(ほぼ)まん中に来ないとまずいわけです。 平均がまん中に来れば一様乱数、とは言えませんが、 まん中に来なけりゃ、一様乱数ではあり得ません。 JavaやCの乱数は、実際は疑似乱数ですが、 いちおう、一様乱数として使えるという事になっています。 標準正規乱数というと山形あるいは帽子型になっているものでしょうか。 それはコンピュータで作るのは面倒になります。 一様乱数をいくつか足すことにより、擬似的に正規分布の乱数を作ることは可能です。

mos21
質問者

補足

回答ありがとうございます。ではMath.randomは一様乱数なのですかね?(^^;

その他の回答 (1)

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.2

擬似一様乱数だと思います。 正確な一様乱数なんてつくれないんじゃないかな? APIとかみるとのってないかなぁ。 多分プログラムで求めている乱数だから 大量にサンプルデータをとればなにか規則がでてくるかもしれませんね!

関連するQ&A

  • 乱数について

    javaで使用可能な乱数にはMath.random()などがあります。その他にもあると思うのですが、なぜ一つの関数だけでないのですか?Math.random()にはなにか周期性や特徴みたいなものはあるのでしょうか?

    • ベストアンサー
    • Java
  • 乱数を配列へ格納(JavaScript)

    乱数を重複しないよう8個配列へ格納したいのですが、 格納の時点でエラーが発生します。 「オブジェクトでサポートされていないメソッドまたはプロパティです」 なぜでしょう? どなたかご教授下さい。 numbers = new Array(); // 空の配列宣言。 function make() { while(numbers.length < 8){ check = true; number = Math.floor(Math.random() * 100);// ランダムに0~99までの整数を取得。 for(i = 0; i < numbers.length; i++) { // 今取得したものと同じ乱数がないか、 if(number == numbers[i]) { // 配列の中身全てと比較。 check = false; } } if(check) { numbers.push(number); // 取得した乱数を配列に格納。 } } }

  • javaの乱数生成プログラム-バグを教えてください

    こんにちは。Web上で「重複しない乱数」を作るプログラムをいくつか見まして、どれもこれも何でこんな複雑なステップを踏むのであろう思い、どーだこんなに簡単に作れるじゃん・・・と0-9までの整数で乱数を生成するプログラムを書いてみたんです。これならAPI調べなくたって基本を身につけていれば誰でも書けると・・・けど、生成する乱数の数が100個とか200個とかなら問題ないんですが、例えば9桁の乱数を10000個作るように設定しても7500個くらいしかListに入りません。原因がどこにあるかお教えいただけますでしょうか。なにとぞよろしくお願いします。 import java.util.ArrayList; import java.util.List; public class RandomExec { static int idLength=9; //乱数の桁数を指定 static int elmSize=100; //生成する乱数の個数を指定 static List<String> list = new ArrayList<String>(); //乱数を格納するリスト public static void main(String[] args) { addList(); //生成された乱数を要素に持つリスト list を取得 //要素をひとつずつコンソール出力 for(String s : list){ System.out.println(s); } } //リストに入れるための乱数を生成するメソッド public static String addId(){ int[] id=new int[idLength]; //int配列idを宣言(要素数=乱数の桁数) String s=""; String str; //配列にMath.random()で取得した要素を入れる for(int i=0; i<idLength; i++){ int n=(int)(Math.random()*10); id[i]=n; } //指定した桁数(この場合は9個)の数字から成るString s を得るため //int型配列idの要素をStringに変換し、すべての要素を連結する for(int n : id){ str = String.valueOf(n); s+=str; } return s; //生成されたStringを返す(下のaddList()メソッドに返しています) } //addIdメソッドで作った要素候補をチェックし、重複がなければListに加えるメソッド //List list の要素数が変数elmSizeで指定した乱数の数と同じになるまで繰り返す public static void addList(){ while(list.size()<elmSize){ //addIdメソッドでlistの要素候補strを取得 String str = addId(); //listに候補と同じ文字列を持つ要素が存在しなければlistに加える if(!list.contains(str)) list.add(str); } } }

    • ベストアンサー
    • Java
  • 正規乱数がうまく使えない

    正規乱数をつかってプログラムを組みたいのですが staticでないメソッドnextGaussian()をstatic コンテキストから参照することはできません というエラーが出てコンパイルできません。 public class sample{ public static void main(String[] args) { int n = 10; double z[] = new double[2*n]; for(int i = 0; i<n; i++){ z[2*i ] = Random.nextGaussian(); z[2*i+1] = Random.nextGaussian();} } } 申し訳ないのですがお手上げなので原因と解決法を教えて いただければと思います。よろしくお願いします。

  • 配列の乱数と平均値、個数表示

    0から9までの整数乱数を100個発生させ、100個の乱数の平均値も合わせて出力し、0から9それぞれの個数を数えるための変数に必ず配列を用いるプログラムを下記に作成したんですけども、出現個数カウント用の変数を10個用意していけないという条件で出現個数カウント用の配列を用意し、 結果が、 7 7 1 7 3 9 1 2 5 0 0 3 6 8 4 9 1 4 2 4 8 2 4 2 6 0 9 3 5 8 6 6 6 2 0 9 5 2 6 9 5 0 5 3 9 2 6 7 0 6 1 4 1 1 1 9 7 0 5 0 6 9 7 4 9 9 7 5 3 6 1 9 6 6 6 7 1 2 6 1 4 9 1 3 1 3 7 0 0 8 1 9 3 2 9 4 4 5 4 0 0 *********** 11 1 ************* 13 2 ********* 9 3 ******** 8 4 ********** 10 5 ******** 8 6 ************** 14 7 ********* 9 8 **** 4 9 ************** 14 平均 4.4 に表示されるプログラムがわかりません、Java初心者なので作ったプログラムのどこを直せばいいのか教えてください。 class Kadai06_5 { public static void main(String args[]) { int n=10; int a[] = new int[n]; int i; int sum=0; double avg=0; for(i=0; i<100; i++){ System.out.print((int)(Math.random()*10)); sum +=(int)(Math.random()*10); } for(i=0; i<n; i++){ System.out.println(); } avg=(double)sum/100; System.out.println("平均"+avg); } }

    • ベストアンサー
    • Java
  • 配列を使用して

    試しに1から150までの中から数字を1つ10回取得しコマンドプロンプト上に表示するというプログラムを作成しました。しかし、コンパイルはできたのですが、変な文字が表示されてしまいます。このプログラムではだめでしょうか? import java.util.*; import java.lang.*; public class hairetu { public static void main(String[] args) { Random generator = new Random(); int hairetu[] = new int[10]; for(int i=0; i<10; i++){ int ran = (int)(Math.random() * 150); hairetu[0]=ran; hairetu[1]=ran; hairetu[2]=ran; hairetu[3]=ran; hairetu[4]=ran; hairetu[5]=ran; hairetu[6]=ran; hairetu[7]=ran; hairetu[8]=ran; hairetu[9]=ran; } System.out.println(hairetu); } }

    • ベストアンサー
    • Java
  • C#の乱数取得について

    C#の乱数取得について カテ違いですが、C#のカテゴリがないのでここで質問させていただきます。 C#の乱数取得について調べましたところ以下のプログラムサンプルを見つけました。 1| int seed = Environment.TickCount; 2| string s = ""; 3| 4| for (int i = 0; i < 10; i++){ 5| Random r = new Random(seed++); 6| for (int j = 0; j < 5; j++){ 7| s += r.Next(50).ToString("00") + " "; 8| } 9| s += Environment.NewLine; 10| } 11| this.textBox1.Text = s; C#は勉強し始めたばかりで、まだまだ知識不足なのでこのプログラムが理解できません。 今の自分の知識で考えたことは、 1行目、int型のseedに、C#の乱数を生成するときにデフォルトで設定されるseed値を格納。 2行目、stringクラスのsを定義。 5行目、Random型(?)rにseedを設定 7行目、わかりません。。乱数を取得してることはわかるのですが。 9行目、sに保持。 11行目、GUIに表示。 どなたか、詳しく解説していただけると助かります。 よろしくおねがいします。

  • 乱数のライブラリについて

    PHP5.2.4を使用しています。 小数を含む乱数を取得したい思ったのですが、そういう関数が見当たらなかったので いっそのこと、そういう機能が集まったライブラリのようなものを作ろうと思いました。 そこでフォルダの構造やクラスの分け方、メンバなどのアドバイスをして頂きたいのですが、 自分としては次のような構成を考えていて ┬ Libraryフォルダ │├Randomフォルダ ││├Abstract.php(各クラスで共通の処理) ││├Integer.php(整数の乱数、分ける目的とはいえ必要かなぁ・・・) ││├Decimal.php(小数の乱数) ││└NormalDistribution.php(正規分布の乱数) └Random.php(このファイルには何のクラスを書けばいいのか・・・そもそもこのファイルは必要?) [Integer.php] class Library_Random_Integer extends Library_Random_abstract { public function __construct($seed = false) { if ($seed !== false) { $this->setSeed($seed) } } public function Next($min, $max) { return rand($min, $max); } } [Decimal.php] class Library_Random_Decimal extends Library_Random_abstract { protected $_decimalPlace; // 最大、小数8位まで public function __construct($decimalPlace = 0, $seed = false) // これだと統一感ないなぁ・・・ { if ($seed !== false) { $this->setSeed($seed) } $this->setDecimalPlace($decimalPlace); } public function setDecimalPlace($decimalPlace) { $decimalPlace = ($decimalPlace > 8) ? 8 : $decimalPlace; $this->_decimalPlace = $decimalPlace; return $this; } public function next($min, $max) { $pow = pow(10, $this->_decimalPlace); $min *= $pow; $max *= $pow; $r = rand($min, $max); return $r / $pow; } } [NormalDistribution.php] class Library_Random_NormalDistribution extends Library_Random_abstract { public function __construct($seed = false) { if ($seed !== false) { $this->setSeed($seed) } } public function next($mu, $sigma) { $r = new DecimalRandmizer(8); $alpha = $r->Next(0, 1); $beta = $r->Next(0, 1) * pi() * 2; $boxMuller1 = sqrt(-2 * log($alpha)); $boxMuller2 = sin($beta); return $sigma * ($boxMuller1 * $boxMuller2) + $mu; } } 使用例 $r = new Library_Random_NormalDistribution(time()); print $r->next(10, 5); .NETのSystem.RandomのNextDouble()メンバのように いちいちクラス分けしなくてもこの例ならNextNormalDistribution()のように 一つのクラスに追加していく形でもいいのかもしれませんが限界がありそうなので こういう構造にしたのですが、自分ならこうするとかここがおかしいとか何でもいいのでアドバイスを頂けないでしょうか?

    • ベストアンサー
    • PHP
  • 0が表示されてしまいます

    次のようなプログラムを作成し、3つの配列の共通部分を表示したいのですが、うまく表示されず0が何個も表示されました。おかしい部分は/**/で囲みましたので、なぜ0が表示されるのかわかる方いましたら教えてください。お願いします。 import java.util.*; import java.lang.*; public class hairetu { public static void main(String[] args) { Random generator = new Random(); int hairetu[] = new int[90]; for(int i=0; i<90; i++) { hairetu[i] = (int)(Math.random() * 450); } int hairetu2[] = new int[90]; for(int i=0; i<90; i++) { hairetu2[i] = (int)(Math.random() * 450); } int hairetu3[] = new int[90]; int k = 0; for(int i=0; i<90; i++) { for(int j=0; j<90; j++) { if(hairetu[i] == hairetu2[j]) { hairetu3[k] = hairetu[i]; System.out.println(hairetu3[k]); k++; } } } System.out.println("\n---------------------------------\n"); int hairetu4[] = new int[90]; for(int i=0; i<90; i++) { hairetu[i] = (int)(Math.random() * 450); } /* int hairetu5[] = new int[90]; int m = 0; for(int i=0; i<90; i++) { for(int j=0; j<90; j++) { if(hairetu3[i] == hairetu4[j]) { hairetu5[m] = hairetu3[i]; System.out.println(hairetu5[m]); m++; } } }*/ } }

    • ベストアンサー
    • Java
  • 乱数を発生させて、それを配列して小さい順に並べる

    乱数の発生のさせ方は、質問集で見て 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