5

Javaでランダムな整数を生成したいのですが、これはいくつかの配布法に従っています。より具体的に:

  • ガウス分布用にランダムな整数を生成したいと思います。ガウス分布に対して2倍の結果を返すジェネレーターのみを見つけました。何故ですか?

  • 指数分布のいくつかの制限の間にいくつかのランダムな整数を生成したいですか?ここでも、doubleを返すジェネレーターについてのみ知りました。また、2つの制限の間でのみランダムな指数数を生成する方法も見つかりませんでした。

手伝って頂けますか?私がやりたいことができる図書館を知っていますか?Michael Flanaganのライブラリ、colt、apacheのCommons Mathを勉強しましたが、必要なものがありません。

ありがとう!

4

4 に答える 4

3

Uncommons Mathsライブラリを使用することをお勧めします。これは、さまざまな乱数発生器 (Mersenne Twister、AES ベースなど) と分布 (ポアソン、ガウスなど) で構成されています。

「二重の問題」については、ほとんどすべてのランダムジェネレーターが最も使用されているため、二重を生成します。整数が必要な場合は、自分で丸めを行う必要があります ( Math.roundを呼び出すだけで十分です)。センチメートルの精度でランダムな人の身長を生成しているとしましょう。ランダム ジェネレーターが 175.234 を返す場合、175 に丸めることができます。これは実際には問題ではありません。

指数分布の制限について: 指数分布にはそのような制限が存在しないため、制限を選択できるジェネレーターはありません。指数分布は通常、ポアソン過程における 2 つの連続するイベント間の遅延をモデル化します。遅延は 0 まで低くなる場合もあれば、非常に高くなる場合もあります。非常に高い結果が得られる可能性は非常に低いですが、不可能ではありません。ジェネレーターから乱数を取得し、下限を追加し、上限よりも高い場合はMath.maxを使用してトリムすることで問題を解決できます。しかし、これはもはや指数分布ではありません。

于 2010-10-10T13:11:20.160 に答える
2

0から1までの倍数がある場合は、整数にスケーリングできます。

int res = lowLimit +(int)(myRandFunction()*(highLimit-lowLimit));

編集:

なぜ私は投票を取り下げたのですか?彼は悲しいことに、彼が望む分布でdoubleを返す関数を持っているので(私はdoubleの形式を0から1と推測しました)、これでうまくいきます。

于 2010-10-10T12:45:16.567 に答える
-1

doubleを生成し、必要な整数範囲にスケーリングするだけです。たとえば、通常の(均一な)乱数ジェネレーターが0.0から1.0までの数値を生成し、0から100までの数値が必要な場合は、生成された乱数に100を掛けるだけです。

于 2010-10-10T12:40:28.990 に答える
-1

boostには、非常に優れた乱数ジェネレーターがいくつかあります。Javaではなくc ++を知っていますが、実装は、それらを自分で実装するための優れたガイドになるはずです。

http://www.boost.org/doc/libs/1_43_0/doc/html/boost_random.html

于 2010-10-10T12:47:27.183 に答える