2017-03-14 10 views
0

Ich möchte verschiedene Zahlen mit C produzieren. Wir können eine Zufallszahl unter Verwendung der stdlib Bibliothek und der srand Funktion erzeugen.Zufallszahlen, die nicht miteinander übereinstimmen

Zum Beispiel; Ich möchte eine Zufallszahl zwischen 0 und 5.

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

int main(void) 
{ 
int i; 
int n = 4; 
int array[3]; 

srand(time(NULL)); 

for(i = 0; i < n; i++) 
{ 
    array[i] = rand() % 5; 
    printf("%d\n", array[i]); 
} 
return 0; 

Aber die gleichen Zahlen produzieren, können here.Like diesem zusammen:

2 
4 
4 
1 

Wie kann ich das verhindern?

+3

Of Thema: 'int array [3 ]; '->' int array [4]; ' – 4386427

+4

Wenn Sie möchten, dass sie eindeutig sind, füllen Sie ein Array mit den Werten 0..5 und mischen Sie es dann, z fisher-yates http://stackoverflow.com/questions/6127503/shuffle-array-in-c –

+2

Nur weil die gleiche Zahl zweimal hintereinander erscheint, bedeutet das nicht, dass es nicht zufällig ist. – dbush

Antwort

0

Vielleicht können Sie etwas wie folgt verwenden:

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int i; 
    int n = 4; 
    int array[4]; 

    // Fill an array with possible values 
    int values[5] = {0, 1, 2, 3, 4}; 

    srand(time(NULL)); 

    for(i = 0; i < n; i++) 
    { 
     int t1 = rand() % (5-i); // Generate next index while making the 
            // possible value one lesser for each 
            // loop 

     array[i] = values[t1];  // Assign value 
     printf("%d\n", array[i]); 

     values[t1] = values[4-i]; // Get rid of the used value by 
            // replacing it with an unused value 
    } 
    return 0; 
} 
-1

Statt Zufallszahl kann man zufällig nicht-Nullpunktverschiebung von der vorherigen Zahl erzeugen:

#include <stdio.h> 
#include <stdlib.h> 

int myrand() { 
     static int prev = -1; 
     if (prev < 0) 
       prev = rand() % 5; 
     prev = (prev + 1 + rand() % 4) % 5; 
     return prev; 
} 

int main(void) { 
     int i; 
     for (i = 0; i < 20; i++) 
       printf("%d\n", myrand()); 
} 
+0

Interessant. BTW, um einen Überlauf zu verhindern, könnte 'else prev = (prev + 1u + rand()% 4)% 5;' – chux

+0

@chux verwenden wo ist Überlauf? Prev ist immer zwischen 0 und 4. – avysk

+0

Wahr, OF Präventionsidee ist für den allgemeinen Fall eher als 5, einige positive "int". 'else prev = (prev + 1u + rand()% (N-1))% N;' – chux

Verwandte Themen