0

頭のてっぺんから、いくつかの解決策を考えることができます(たとえば、ランダムな奇数を取得することに焦点を当てています):

int n;
while (n == 0 || n % 2 == 0) {
    n = (arc4random() % 100);
}

ええと..そうですか?まったく効率的ではありません..

int n = arc4random() % 100);
if (n % 2 == 0) n += 1;

しかし、奇数でない限り、常に数が増えるのは好きではありません..多分それは問題ではないでしょうか? 別のアプローチは、それをランダム化することです。

int n = arc4random() % 100);
if (n % 2 == 0) {
    if (arc4random() % 2 == 0) {
       n += 1;
    else {
       n -= 1;
    }
 }

しかし、これは私には少し寂しい気がします..だから、この種のことを行うためのより良い方法があるかどうか疑問に思っていますか?

4

2 に答える 2

6

乱数を生成し、偶数の場合は2を掛け、奇数の場合は2+1を掛けます。

一般に、これらを単純に保つ必要があります。そうしないと、数値の分布を台無しにするリスクがあります。典型的な[0...1)乱数ジェネレーターの出力を取得し、関数を使用して目的の範囲にマップします。

FWIW-3番目の分布を除いて、上記の分布を歪めているようには見えません。モジュラスを含む調整を行わない限り、99を取得する可能性は他のすべてよりも低いことに注意してください。負の数。以来..

P(99) = P(first roll = 99) + P(first roll = 100 & second roll = -1) + P(first roll = 98 & second roll = +1)

P(first roll = 100) = 0

于 2012-08-15T21:03:12.160 に答える
3

固定数字が後に続く 2 進数のランダムなセットが必要な場合は、ビットごとの演算を使用します。

 odd = arc4random() | 1; 
 even = arc4random() & ~ 1;  
于 2012-08-15T21:07:46.313 に答える