2009-11-04 7 views
5

-nから0を除くnまで乱数を生成したいのですが、誰かがCでコードを提供できますか?どのように0を除外する?Cで-nからnまで乱数を生成

result= n - randomNumber 

0もののあなたがその使用を確認することができ非常に低いかもしれません:

+1

なぜダウン票ですか?私は、このサイトで人々が強制的に投票したときにコメントを追加することを願っています。 –

答えて

9

[1,2n]の範囲の乱数xを生成することが考えられます。次にxのより大きい-(x - n)を返します。それ以外の場合は、xを返してください。

これは動作するはずです:

int my_random(int n) 
{ 
    const int x = 1 + rand()/(RAND_MAX/(2 * n) + 1); 

    return x > n ? -(x - n) : x; 
} 

が安全rand()を使用する方法の詳細については、comp.lang.c FAQを参照してください。上記の使用法を説明しています。

+0

ありがとうございます。クリスはちょうど私の前に答えを掲示しました。 – avd

3

私が行うことをお勧めすることができます最も簡単な方法は、数学のトリックを行うために0と2Nと、その後の間の乱数を生成することですもし、乱数生成をやり直す。

1
int random(int N) 
{ 
    int x; 
    do{ 
    x=rand()%(N*2+1)-N; 
    }while(x==0); 
    return x; 
} 

コメントで示唆したようにこれは、-NからNまで番号を選択し、それが0

代替である場合、それを実行し続ける、-NとN-1の間の数を生成します正または0の場合は増分します。

+1

do-whileはランダムな値に依存して、長い間実行することができます!しかし、ランダムな結果の範囲を1減らし、0の結果を人為的に境界線の結果に変換することによって、非決定論的な実行時間を取り除くことができます。ループは必要ありません。 –

+0

私はあなたのステートメントに「長い、長い時間がかかる」と同意しません:xが0である確率(したがって、ループの繰り返し)は1 /(2N + 1)であり、値N. それにもかかわらず、私は私の答えにあなたの提案を組み込んだ、私はこの特定の問題のために良い解決策をもたらすと思うので、ありがとう:) – Wernsey

+0

ああ...私はそれが "むしろ時間がかかる可能性があります。違いがあります! :) 私はそれが乾いたように聞こえる場合はお詫び申し上げます。私はリアルタイムソフトウェアで働いています。何らかの確定的な時間で完結することが絶対に保証されないものは、「長い時間がかかります」。技術的には、最初のバージョンはO(?)で、2番目のバージョンはO(1)です(最悪の場合、 "rand"よりも複雑ではありません)。したがって、決定論の点では、2番目のバージョンは大きな改善点です。 うまくやって、btw。私は「0を境界に変換する」という提案はあまりにもきれいではないでしょう。 –

関連する問題