2017-08-06 4 views
0

、それは例えばJavaでは、ランダムNビットを生成する簡単な方法はありますか?ただし、すべてのNビットに少なくとも1ビットが1に等しいことを確認してください。 Nとして

179と同じ大きさとすることができる、私は、32ビットまでのnのためにそれを行うことができた。)

new Random().nextInt(2^n-1)+1 

nextLong(私ができるので不可能ですそれに値を渡すことはなく、最大48ビットのランダム値しか生成しません。

+0

ランダムに生成されたビットストリング内の任意の数のビットをランダムにシフトします。 –

+0

ゼロ以外の数値については、ゼロ以外のビットが保証されます。ランダムな非ゼロ数は、ランダムなビットのシーケンスです。 –

答えて

4

BigIntegerを使用して乱数を作成します。それがゼロになる場合は、もう一度試してください。

public static BigInteger randomForBitsNonZero(int numBits, Random r) { 
    BigInteger candidate = new BigInteger(numBits, r); 
    while(candidate.equals(BigInteger.ZERO)) { 
     candidate = new BigInteger(numBits, r); 
    } 
    return candidate; 
} 

これは、ビット数についてランダムに発生します。 if文が非常に高いnumBitsのトリガーとなる可能性は非常に低いですが、保護は控えめであり、numBitsの値が0になることがあります。

+0

これは 'do ... while'ループを使用します。そうすれば、2つではなく、1つの '候補=新しいBigInteger(numBits、r);'文が必要になります。 – rossum

+0

あなたはそうかもしれませんが、読みやすくするために使用されることはめったにありません。もし私がそれをやろうとすれば、私はちょうど '真実{BigI can = new BigI(...); if(can.equals(BigI.ZERO))が返すことができます。 } ' – corsiKa

0

Random.nextBytes()を使用すると、任意の数のランダムバイトを生成できます。必要なバイト数は(ビット数+ 1)/ 8です。

少なくとも1つのビットが1に設定されていることを確認するには、任意のビットをランダムに選択するか、次のように1に設定します。

int bitIndex = random.nextInt(N); 
int byteIndex = bitIndex/8; 
bitIndex = bitIndex % 8; 
randomBytes[byteIndex] |= (1 << bitIndex); 
+0

「ランダムビットを設定する」は、PRNGにバイアスを導入します。 「数字」(つまり、例のすべてのバイト)がゼロであるかどうかをテストして、もう一度試してみることをおすすめします。 –

+0

@StephenC true。 –

関連する問題