、それは例えばJavaでは、ランダムNビットを生成する簡単な方法はありますか?ただし、すべてのNビットに少なくとも1ビットが1に等しいことを確認してください。 Nとして
179と同じ大きさとすることができる、私は、32ビットまでのnのためにそれを行うことができた。)
new Random().nextInt(2^n-1)+1
nextLong(私ができるので不可能ですそれに値を渡すことはなく、最大48ビットのランダム値しか生成しません。
、それは例えばJavaでは、ランダムNビットを生成する簡単な方法はありますか?ただし、すべてのNビットに少なくとも1ビットが1に等しいことを確認してください。 Nとして
179と同じ大きさとすることができる、私は、32ビットまでのnのためにそれを行うことができた。)
new Random().nextInt(2^n-1)+1
nextLong(私ができるので不可能ですそれに値を渡すことはなく、最大48ビットのランダム値しか生成しません。
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になることがあります。
Random.nextBytes()
を使用すると、任意の数のランダムバイトを生成できます。必要なバイト数は(ビット数+ 1)/ 8です。
少なくとも1つのビットが1に設定されていることを確認するには、任意のビットをランダムに選択するか、次のように1に設定します。
int bitIndex = random.nextInt(N);
int byteIndex = bitIndex/8;
bitIndex = bitIndex % 8;
randomBytes[byteIndex] |= (1 << bitIndex);
「ランダムビットを設定する」は、PRNGにバイアスを導入します。 「数字」(つまり、例のすべてのバイト)がゼロであるかどうかをテストして、もう一度試してみることをおすすめします。 –
@StephenC true。 –
ランダムに生成されたビットストリング内の任意の数のビットをランダムにシフトします。 –
ゼロ以外の数値については、ゼロ以外のビットが保証されます。ランダムな非ゼロ数は、ランダムなビットのシーケンスです。 –