利用規約の変更について

正規乱数をボックスミューらー法で発生させて、
範囲を指定して出力したいと思ってます。
プログラムを作成してみたのですが・・・
平均50で範囲を48から52にしたいのですが
たまに範囲外というか「0.0」が出力されてしまいます。
アドバイスをください

import java.util.*;
public class test2{
public static void main(String args[]){
double R,S;
double r[]=new double[200];
 double s[]=new double[200];
double s1[]=new double[200];

Random ran=new Random();
   for(int i=0;i<200;i++){
    R=ran.nextDouble();
S=50+Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble()));
r[i]=R;

s1[i]=S;

if(50-2<s1[i]){
if(50+2>s1[i]){

s[i]=s1[i];



}
}
}



for(int j=0;j<150;j++){

System.out.println(s[j]);

}
}
}

お願いします

A 回答 (4件)

これは


if(50-2<s1[i]){
if(50+2>s1[i]){
のため48.0<s1[i]<52.0以外例えば
47.8や52.3のときはs[i]に0.0が代入
されているのですね。
なのでそれ以外のときは何を代入するかですが

単純に考えてその場合は出力しなければよいの
ですから
for(int j=0;j<150;j++){
if(s[j]!=0.0){//0でなければprintする。

System.out.println(s[j]);
}
}
    • good
    • 0
この回答へのお礼

なるほど!
かんたんな事でしたね!
ありがとうございました!

お礼日時:2006/07/03 16:10

こんにちは、


48~52の乱数、平均を50とすると、
1~5の乱数を作り、
47に加えれば良いのでは、ないでしょうか。
    • good
    • 0
この回答へのお礼

正規乱数で1~5というのは指定できるのでしょうか・・?
とりあえずやってみます!
ありがとございました

お礼日時:2006/07/03 16:09

>たまに範囲外というか「0.0」が出力されてしまいます。



logやcosやsqrtは、定義域にない引数を渡すとエラーになります。

また、式の途中でオーバーフローが起こる可能性もあります。

その場合、
S=50+Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble()));
は実行されないか、Sはオーバーフロー値になります。

結果、
s1[i]=S;
も実行されず、s1[i]は初期値(0.0)のままになります。

なので、このままでは、たまに0.0が出ます。

S=50+Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble()));

S=0
S=Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble()));
S=S+50
にしてみましょう。0.0は出なくなります。但し、オーバーフローや値域エラーの場合にSは最終的に50.0になるので「50.0だけ少し多く出現する」と言う偏りが出ます。

偏りを無くすには、オーバーフローと値域のチェックを行いましょう。
    • good
    • 0
この回答へのお礼

0.0になってしまう理由がわかりました!
ありがとうございました!

お礼日時:2006/07/03 16:12

正規乱数をボックスミューらー法は知りませんが


単純に、条件に合わなくて、

s[i]=s1[i];

に行かない場合があるからでは?

if文から外れたときの値を、表示してみてはいかがでしょうか?
    • good
    • 0
この回答へのお礼

if文ではじかれた配列が0.0になるんですね!
アドバイスありがとうございました!

お礼日時:2006/07/03 16:13

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q乱数の桁数指定、または範囲指定。

こんにちは。javaで乱数を発生させる場合に
Math.randomというメソッドを使用しているのですが、
桁数指定とかって可能なのでしょうか?
(例)2桁の数値のみをランダムに発生させる等
1桁、3桁は不可。
また、範囲の指定など可能なのでしょうか?
(例) 25から70までの範囲でランダムに発生させる。

わかる方、教えていただけると幸いですm(_ _)m
よろしくお願い致します。

Aベストアンサー

n ≦ i ≦ m のように
n 以上 m 以下のランダムな整数 i を取得したい場合

random() 関数は 0 ≦ x < 1 の数字を返しますので
下記の式で得られます。

i = Math.floor(Math.random() * (m - n + 1)) + n ;

ランダムとして剰余を使うこともありますが、擬似乱数を線形合同法にて算出している場合、剰余だと系列が偏る可能性があります。
あと、一定の数が出るまでループするというのは、不要なループを繰り返す場合がありますので、すこしもったいない感じがしますね。

Q一定のスペースを空けて端を揃えて表示

一定のスペースを空けて端を揃えて表示

お世話になります。
一定のスペースを空けて文字を表示したとき、縦に綺麗に揃えて表示したいのですがやり方がわかりません。
例えば、

apple ここに15個分のスペース (2,8) (3,6)
orange ここに15個分のスペース (3,7) (9,8) (2,10)
dog ここに15個分のスペース (3,0)
fortunately ここに15個分のスペース (6,6)

このように、各行の左側には英単語1つ、そして15個分のスペースを空けて、右側にその単語の座標を表示します。
この時に、座標を縦にきれいに揃えて表示したいのですが、英単語の長さによってバラバラになってしまいます。
どのようにスペースをあけて表示すればよいのでしょうか?宜しくお願いします。

Aベストアンサー

5分遅れで同じ回答をしてしまった(^^;
ついでなので、もう少し文字種の範囲を広げても大丈夫なものを作成してみた。

public static void main(String[] args) {
String[] word = {"りんご", "おranじ", "犬", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("Shift_JIS");
int width = word[0].getBytes(charset).length + 15;
for (int i = 0; i < word.length; i++) {
String format = "%-" + (width - word[i].getBytes(charset).length + word[i].length()) + "s%s%n";
System.out.printf(format, word[i], coord[i]);
}
}

前提として、
与えられた文字がシフトJISで表せるようなもので、
シフトJISで1バイトコードになるものがいわゆる半角(1桁幅)、
2バイトコードになるものがいわゆる全角(2桁幅)となるのなら、
上のようにすることで対処できる。

要点は文字数でなく文字を構成するコードが何バイトかを数えて、
2バイトなら2桁分のスペースを用意する。
これには、getBytesでStringからバイト配列を得てlengthでバイト数を得る。

今度は書式文字列は各行ごとに変わる可能性がある。
widthはword[0]の文字列幅に15スペース分を加えたもの。
"apple"でなく"りんご"なので21になる。
つまり座標の表示は22桁目からということになる。

各行の書式文字列での、
(width - word[i].getBytes(charset).length + word[i].length())
で、バイト数と文字数との差を求めて表示幅から引くことで、
1文字が2桁になる場合に対処している。

書式は使いどころによって便利なもので、
printfで書式出力するところを、
StringクラスのformatメソッドでStringインスタンスにすることもできたりする。

5分遅れで同じ回答をしてしまった(^^;
ついでなので、もう少し文字種の範囲を広げても大丈夫なものを作成してみた。

public static void main(String[] args) {
String[] word = {"りんご", "おranじ", "犬", "fortunately"};
String[] coord = {"(2,8) (3,6)", "(3,7) (9,8) (2,10)", "(3,0)", "(6,6)"};
java.nio.charset.Charset charset = java.nio.charset.Charset.forName("Shift_JIS");
int width = word[0].getBytes(charset).length + 15;
for (int i = 0; i < word.length; i++) {
String format = "%-...続きを読む

Qpublic static void main (String args[])

基本すぎて申し訳ありませんが、
public static void main (String args[])とはどういう意味を持っていますか?
教えてください。。

Aベストアンサー

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

これを
>java ArgsTest abcde fghij(エンター)
として実行するとabcdeとfghijが引数となります。

ちなみに、mainはpublicでstaticなメソッドなので、
public class ArgsTest2{
  public static void main(String args[]){
    tamesi();
  }
  void tamesi(){
    String[] test = {"abcde","fghij"};
    ArgsTest.main(test);
  }
}
のように、外部のクラスからクラス名.mainで呼び出せます。(この2つのプログラムは、私が悩んだ時に試しにつくったものです)

ちなみにargsはarguments(=引数)の略で、mainの引数として、よく使われます。
argvのほうはargument valueの略です。C言語を使っていた人の中にはargvを使う人がいるかもしれません。

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

...続きを読む


人気Q&Aランキング

おすすめ情報