2016-06-20 3 views
3

タイトルが説明するように、私は一連のランダムな短い値を生成したいと考えています。しかし、私は完全にこのキャスティングはどのように行われるかを理解していないランダムな整数を短くキャストすると均一な分布が得られますか?

Random rand = new Random(int seed); 
(short) rand.nextInt() 

を:なしRandom.nextShort()関数が存在しないので、私が欲しいものを行う最も簡単な方法は、使用して、短いの整数をキャストするように思わ私は結果として得られる短い値が依然としてランダムであることを確かめることはできません。これは本当ですか?前もって感謝します。 intがあるので

答えて

3

標準的な方法を行うことですshort result = (short)(rand.nextInt(Short.MAX_VALUE-Short.MIN_VALUE+1) + Short.MIN_VALUE)。これは、Short.MAX_VALUE-Short.MIN_VALUE+1の範囲にある数値から数値を求め、Short.MIN_VALUEで始まるためです。

単純な切り捨ては、shortである可能性があります(速度が問題であれば、おそらく高速です)でも、この方法はどの範囲でも機能します。

のは、あなたがして rand.nextInt(12-(-5)+1)+(-5)を呼び出します、またはあなたはすべての計算を簡略化する場合は、 -512(両方を含む)の間の乱数をしたいとしましょう: rand.nextInt(18)-5を。

-1

数はまだランダムになりますが、あなたは、この数の異なる最大値/最小値に問題があることができ、より多くの情報のために、ここで最初の答えでhere

-1

を見て、私は、これは動作しませんと思いますshortよりはるかに大きい。

ただ、ランダムfloatまたはdoubleを取る(値は[-1; 1]の間にある)と短いの最大値によってそれらを乗算:int型の

short i= (short) rand.nextFloat() * Short.MAX_VALUE; 
4

短いキャストはビット単位で動作します切り捨て整数がランダムに分布している限り、短い値は - yesでなければなりません。 Java言語仕様5.1.3から

一体型T の符号付き整数の縮小変換は、単にすべてが、Nは使用されるビットの数 あるN最下位ビットを破棄する

int値が範囲Rになるまでshort 16.本質的変換は(16の力に2である)65536加算(または減算)と同じでいる32ビットを有するタイプTを表しますshortによって表現される。従って、正確には、それぞれの可能な値shortにマップする値が65536 intです。

1

エラーを回避するための良い解決策がある:

Random rand = new Random(int seed); 
short s = (short) rand.nextInt(Short.MAX_VALUE + 1); 

あなたも負短い必要がある場合:

short s = (short) rand.nextInt(Short.MAX_VALUE - Short.MIN_VALUE + 1) + Short.MIN_VALUE; 

最速のソリューション:

short s = (short) random.nextInt(1 << 16); // any short 
short s = (short) random.nextInt(1 << 15); // any non-negative short 
+0

これは良いことですが、それはあなたに非ネガティブな結果しか与えません。 – biziclop

関連する問題