• ベストアンサー

係数を指定して擬似乱数の生成

Javaでユーザーがプログラム中で制御可能な任意の係数を使用して、 擬似乱数を作成する機能が欲しいと考えています。 その様な機能は提供されますか? また、その様な機能を実装しようとすると、どの様にすればよいでしょうか? 実現したい機能としては、 1.ユーザーが係数を任意に指定可能 2.同様の係数が与えられれば、異なるVM上であっても出力される乱数は完全に一致する。

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

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

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

そのなもずばり java.util.Random クラスというのがあります。

VinterBC
質問者

お礼

ありがとうございます! Math.random()の方しか無いと早合点していました。 第二コンストラクタが引数に取る「long 型のシード」という物が、 私の言うところの擬似乱数生成の係数となるのでしょうか。 ひとまず、これでどうなるか試してみようと思います。 ありがとうございます。 ※ちなみに何がしたいかと言いますと、 ちょっと古いんですがバーコードバトラー的な事がしたいです。

その他の回答 (3)

  • hrsmmhr
  • ベストアンサー率36% (173/477)
回答No.4

どれくらいの乱雑さが必要でしょうか? 補足など見てると 定数倍して大きな素数で割った余りでも良さそうな気もしますが…

VinterBC
質問者

お礼

不特定多数のユーザーが任意のシード値を入力して結果を持ち寄り、 その上で明らかな規則性が見て取れてしまう様な事が無い程度に乱雑であれば問題無いと考えます。 ひとまずjava.util.Randomの動作を弄繰り回して確認してみようと考えています。 (現在javaを開発実行できる環境が手元に無いのでうずうずしておりますが)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

あなたのいう「係数」って, 何? ふつう「係数」っていうと「なんかの式にかかる倍率」のように聞こえるけど, そうじゃないよね? 「(得られる) 疑似乱数列を制御するために (最初に) 与えるデータ」は「シード」とか「種」とか言います.

VinterBC
質問者

お礼

ありがとうございます。 自前で実装する前提で考えていた為、 係数(擬似乱数生成の鍵となる因数値)という表現になってしまいました。 質問させて頂く時に、正確な表現を選ばなければ目的がブレてしまい困ります。 そう言った意味でも勉強になりました。ありがとうございます。 今回は私の言う所の係数=シードという事になりますね。

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.2

乱数と係数の関係を具体的に定義してください。 例)5~15の間の整数乱数 因みに、 > 2.同様の係数が与えられれば、異なるVM上であっても出力される乱数は完全に一致する。 完全に一致したら乱数とは言わない…。 (範囲が同じということ?)

VinterBC
質問者

補足

>乱数と係数の関係を具体的に定義してください。 >例)5~15の間の整数乱数 説明が足りていませんでした。申し訳ありません。 乱数の範囲はint型で扱える範囲の値を指定したいです。 また、係数はDate(long)値程度の範囲の指定が出来れば十分かと考えています。 ありがとうございます。 >完全に一致したら乱数とは言わない…。 乱数の場合一致したら乱数とは言えませんね。 今回は乱数でかつ、再現性を求めたい為に擬似乱数に関して調べておりました。

関連するQ&A

  • 論理回路を用いた擬似乱数出力回路

    ttp://laputa.cs.shinshu-u.ac.jp/~yizawa/logic2/chap8/ このサイトの「除算回路」を実現して乱数回路を作ったのですが、 M系列の式って「Xn = Xn-p xor Xn-q」ですよね? ttp://shika.aist-nara.ac.jp/member/takesh-n/cdma/mseq-gene.html ここの最初の回路で、出力を(5)とすると、 X(5-1) xor X(5-4)  で、(1)と(4)のXORと思うのですが、何故(4)と(2)なのでしょうか? それと、一番↑のアドレスの除算回路設計をM系列の式を用いて解説お願いします 実際、擬似乱数の出力結果にはなりましたが、なぜあのような回路になるのかがわかりません 変なところからXORが伸びているようにしか見えません

  • 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
  • 文字列から乱数を作る方法について。

    最近PHPの勉強をしており、文字列をhash関数の入力として用いて、0~100の乱数を生成する機能を実装しました。 ですが、出力結果に偏りがみられます。 再現性を残して、できるだけ偏りの無い乱数を作りたいと考えています。 何かいいアイデアやサイトを御存知でしたら教えてください。 現在は以下のようなコードで乱数を生成しています。 $seed = hash("sha512",$setstring); $seed = $seed[0].$seed[1].$seed[2]; $seed = intval($seed,10); srand($seed); for($i=0; $i<10; $i++){ $lv = rand()%100; }

  • 擬似乱数生成器が怪しい?

    首記の話があるようだがこれは事実か、事実としたらその影響は莫大では?

  • 擬似乱数生成について

    お世話になります。 下記、問題について教えてください。   ============ 問題 =============   線形合同法はA,C,Pを秘密の定数(Pは素数),初期値をR1として下記演算によって計算される系列 R1,R2,R3・・・・を擬似乱数として用いる。 R_{i} = A・R_{i-1} + C (mod P) このアルゴリズムと素数Pがわかっているとき、いくつの乱数値がわかれば次の乱数値が計算できるか?その理由も示せ。   ============================= 自分なりに調べてやってみたのですが、いまいちよくよく分かりません。 直感的に、未知数が3個あるので連続した3つの乱数値を各Rとして代入すれば、2元1次方程式を得られ、A,Cが決定できると思ったのですが、どうもうまくいかない・・・ 暗号理論の専門書を読んでみたところ、やはりPが判明いてる場合、連続した3つの値で良いようです。もしPが判明していない場合でも、4つ以上の連続した値から次の乱数値が分かるそうです。 完全に混乱しています。どなたか分かる方、解説していただけませんか。 よろしくお願いします。

  • 0 からa-1 までの整数の乱数をn 個発生させ、発生した整数のヒスト

    0 からa-1 までの整数の乱数をn 個発生させ、発生した整数のヒストグラムをプリントアウトしたいです.また,a とnはコマンドラインから引き渡します 0 からa-1 までの整数を発生する乱数の書き方は (int)((double)rand()/((double)RAND_MAX+1) *a); プログラムをRandHist としたとき RnadHist 10 1000 と入力すれば 0 982 1 1035 2 956 3 1102 ・ ・ 9 971 などと。出力されるようなプログラムを作る問題ですが,a とn は、任意に変えられるように したいです. どなたか教えてください.

  • プログラム上からUSBやLANから任意の高周波パルスを出力する方法を探しています。

    USBやLANポートを制御して、発信器のように使用できますか? プログラムから任意の周波数のパルスを出力したいです。 PCから制御できるファンクションジェネレータを使用すると大掛かりになってしまうので、代替方法を探しています。 可能ならばWindowsXPでC++等で実現する方法を教えて下さるとありがたいです。 振幅は問わず、~10MHzのパルス出力が可能な方法はないでしょうか。

  • java プログラム 範囲を指定した乱数

    正規乱数をボックスミューらー法で発生させて、 範囲を指定して出力したいと思ってます。 プログラムを作成してみたのですが・・・ 平均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]); } } } お願いします

    • ベストアンサー
    • Java
  • RubyでJavaのInterfaceに相当するものはありますか?

    RubyでJavaのInterfaceに相当するものはありますか? Ruby 上で Javaの interface のようなものものを実現するには、どうしたらよ いのでしょうか? Rubyは型を宣言しないので機能的には interface は不要ですが。 クラスを実装する人に、あるクラスに実装しなければいけないメソッドを伝える (強制する)目的としての interface 的な使い方をしたいのです。 宜しくお願いいたします。

  • プラスの乱数の合計とマイナス乱数の合計の商の値を上げるには?

    プラスの乱数の合計とマイナス乱数の合計の商の値を上げるには? 以下ルールで乱数を使ってプラスの乱数とマイナス乱数の合計の商の値をいかにして上げられるかの検証をやってます。 しかし今の私の知恵では商の値を動かす事ができません。 乱数の範囲は-10から+10とします。 乱数を発生させ与えられた値が仮得点として加算されます。 そして任意のロジックで仮得点を正式な得点として加算します。 その任意ロジックは例えば仮得点がマイナス幾つになったら、またはプラス幾つなったら仮得点を仕切り正式な得点として加算するというもの。 但し、仮得点がマイナスの場合、プラスの場合とそれぞれ1つ以上の仕切りロジックを作らなければならない。 そして仮得点がマイナスとプラスの場合に分けそれぞれ別の変数に加算する。 (もし仮得点がマイナスなら変数mynas プラスなら変数plus) 仕切られた仮得点は0に戻る。 最終的にその計算を数多く繰り返してプラスの乱数とマイナス乱数の合計の商の値を出力する訳です。 文章では分かりにくいので、私が行いたい検証をプログラムソース風に明記します。 //仕切りロジック 例えのロジックとして仮得点が+100以上、-100以下になったら、仕切って+100、-100をそれぞれ正式得点に加算する処理を1000回繰り返し最後にプラスの変数÷マイナスの変数の商を出力 //仮得点がマイナスの場合、プラスの場合とそれぞれ1つ以上の仕切りロジックを作らなければならない(変数plusのみまたは変数mynasのみのロジックは不可) //仮得点加算変数 KariTokuTen=0 //プラス得点加算変数 plus=0    //マイナス得点加算変数 mynas=0 for(i=0;i<1000;i++){ //whileループを止める為の変数 ex=0; while(ex==0){   //乱数(-10..10)を発生させ仮得点として加算(乱数の範囲変更不可) KariTokuTen=KariTokuTen+rand(-10..10) if( KariTokuTen >= 100){ //仮得点が100以上になったら100をプラス変数に加算 plus=plus+100 //仮得点を初期化 KariTokuTen=0 //whileループを止める変数 ex=1 } else if(KariTokuTen <= -100){ //仮得点が-100以下になったら-100をマイナス変数に加算 mynas=mynas-100 //仮得点を初期化 KariTokuTen=0 //whileループを止める変数 ex=1 } } //加算処理が終了しプラス得点とマイナス得点の商の値を出力 (この商の値を上げたい) print plus/mynas 私としてはルールを守った上で上述のロジックに限らず色々なロジックを発案し(プラスの変数÷マイナスの変数)の商の値がより高くなようにしたいです。上記のロジック以外にも色々と試してみましたが商の値は+-1ばかりで全くコントロールできません。 何卒ご教授宜しくお願いします。

専門家に質問してみよう