2016-07-20 4 views
2

Ich versuche, skip-Liste einfügen, also verwende ich rand(), um das Niveau zu bestimmen. Ich weiß, dass ich dauernde Münzwürfe machen muss, also denke ich, wenn ich Testanzahlen für den Generator drucke, sollte es ungefähr 50% weniger für jedes nachfolgende Niveau haben. Ich bin irgendwie mit der Logik beschäftigt, aber ich kann meinen Fehler nicht verstehen. Auf der letzten Ebene ist es ~ == zu der Ebene davor, anstatt der Hälfte.Logik Verwirrung mit rand() in einer for-Schleife

Hier ist mein Code:

#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]); 

Und hier ist der Ausgang:

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

Ich bin irgendwie mein Fehler erwartete etwas albern zu sein, aber ich habe für eine an diesem gesucht während jetzt und kann nicht scheinen, es zu fangen.

+1

'newLevel <= MAXLEVEL' – gudok

+0

Hmmm, mein Buch hat eigentlich' <'auch, ich denke, das ist ein Tippfehler? edit: Wenn ich es zu '<=' ändere, bekomme ich 'ABORT TRAP (6)', aber Werte, die korrekt aussehen. – Austin

+1

Sie erhalten die Abbruchfalle, weil Sie das Ende des Arrays schreiben. Ändern Sie 'int a [6]' in 'int a [7]', wenn Sie 'newlevel <= MAXLEVEL' verwenden möchten – user3386109

Antwort

2

Angenommen, wir haben es bis zum Level i geschafft. Die Chancen, die wir auf das nächste Level bringen, sind ~ 0,5. Dies bedeutet, dass, wenn wir es zu i-Level N Mal gemacht haben, dann ~ 0,5 * N-mal stoppen wir auf Level i und ~ 0,5 * N-mal wir fördern auf das nächste Level. Entsprechend stoppen wir bei Level i ~ 0,5 * N-mal und Summe von allen weiteren Level-Werten ist auch ~ 0,5 * N. Daher haben die letzten zwei Ebenen ähnliche Werte, egal wie viele es Ebenen gibt.

Sequenz von X, X/2, X/4, X/8, X/16, X/16 wird erwartet. Wenn Sie möchten, dass das letzte Mitglied X/32 ist, fügen Sie einfach ein künstliches Level hinzu.

+0

Um ehrlich zu sein, habe ich Probleme, dies zu folgen. Ich verstehe nicht den Punkt, den Sie über die Summe der weiteren Ebenen machen, oder warum die "i-te Ebene" anders ist als die "i-1-te Ebene". Bedeutet das auch, dass eine Skip-Liste, die diesen Code für die Level-Bestimmung verwendet, es falsch macht? – Austin

+0

Mein Punkt ist, dass es für den obigen Algorithmus erwartet wird, auf den letzten zwei Ebenen ähnliche Werte zu erzeugen. Ob es richtig ist oder nicht - ich kann nicht antworten ohne das Buch zu lesen, das du hast. Aber ich vermute, dass diese Skip-Liste nur 5 wahre Level haben soll, 0 bis 4. Level Nummer 5 ist künstlich. – gudok

+0

ah ich sehe, danke. – Austin