2016-07-20 10 views
2

私はスキップリスト挿入をしようとしていますので、レベルを決定するためにrand()を使用しています。私は連続コインフリップをする必要があることを知っているので、私は、ジェネレータのテストカウントを印刷すると、連続レベルごとに約50%少なくなるはずです。どういうわけか私は論理を台無しにしていますが、私は間違いを犯すことができません。最後のレベルでは、半分ではなく、前のレベルに〜==です。ここで forループでのrand()とのロジック混乱

は私のコードです:

#define MAXLEVEL 5 
srand(time(NULL)); 
int newLevel; 
int a[6] = {0}; 
for (int i = 0; i < 100000; i++) {  
    for (newLevel = 0; (rand() < RAND_MAX/2) && (newLevel < MAXLEVEL); newLevel++); 
    a[newLevel]++; 
} 
printf("0: %d 1: %d 2: %d 3: %d 4: %d 5: %d\n", a[0], a[1], a[2], a[3], a[4], a[5]); 

そして、ここでは出力です:

0: 50018 1: 24969 2: 12532 3: 6334 4: 3094 5: 3053 

私は一種の愚かな何かをする私のミスを期待していたが、私はこの時に見てきました今はそれを捉えることができない。

+1

'newLevel <= MAXLEVEL' – gudok

+0

私の本には実際に' <'もありますが、これは誤植でしょうか?編集: '<='に変更すると 'ABORT TRAP(6)'が表示されますが、正しい値になります。 – Austin

+1

アレイの終わりを書き去っているため、アボートトラップが表示されます。 'newlevel <= MAXLEVEL'を使いたい場合、' int a [6] 'を' int a [7] 'に変更してください。 – user3386109

答えて

2

レベルiにしたとします。私たちが次のレベルに昇進するチャンスは〜0.5です。これは、iレベルの場合N回、〜0.5 * N回レベルiで終了し、〜0.5 * N回私たちは次のレベルに昇格することを意味します。同等に、我々はレベルi〜0.5 * N回で停止し、合計のレベル値は〜0.5 * Nである。したがって、最後の2つのレベルは、合計レベルがいくつあっても同様の値を持ちます。

X、X/2、X/4、X/8、X/16、X/16のシーケンスが予想されます。最後のメンバーをX/32にしたい場合は、人工レベルを追加するだけです。

+0

正直言って、これに続く問題があります。私はあなたがさらなるレベルの合計について、またはなぜ私のレベルが「i-1」レベルと異なるのかを理解していません。また、これはレベル判定にこのコードを使用しているスキップリストが実際に間違っていることを意味しますか? – Austin

+0

私のポイントは、上記のアルゴリズムが最後の2つのレベルで同様の値を生成することが期待されるということです。それが正しいかどうか - あなたが持っている本を読まなければ私は答えることができません。しかし、私の推測では、このスキップリストは0〜4の5つの真のレベルしか持たないはずです。レベル5は人工的です。 – gudok

+0

ああ、ありがとう、ありがとう。 – Austin

関連する問題