rand
-
SideWinder schrieb:
Du überprüfst zwar, ob die Zahl bereits einmal vorgekommen ist - falls ja generierst du eine neue Zahl: Was aber wenn diese nun ebenfalls bereits vorkommt?
darum sollte ja j=0 die überprüfung neu starten
BTW: Es hat nicht gerade viel Sinn was du hier machst. Wenn es dir einfach darum geht, dass die Zahlen 1-8 in einer zufälligen Reihenfolge im Array sind dann schreib sie ins Array und mische sie danach.
gute idee weiss zwar noch nicht wie aber ich denke nach
-
hab mal über deinen vorschlag nachgedacht....
jedoch:
int main(void) { int r,i,j,k,l; char farben[8]={1,2,3,4,5,6,7,8}; srand(time(0)); for(r=0;r<100;r++) { i = farben[j=rand()%8]; k = farben[l=rand()%8]; farben[l]=i; farben[j]=k; } for (i=0;i<8;i++) { printf("Zahl %d: %d\n",i,farben[i]); } getch(); return 0; }
Geht das nicht eleganter???
-
weiss wer was eleganteres oder soll ich das so verwenden wie es meiner kranken phantasie entsprungen ist??
ich denke mir nämlich dass ich zu viele veriablen brauche...
-
Pseudocode:
for (i = n; i > 0; i--) swap(a[n], a[rand(i)]);
erzeugt dir eine beliebige Permutation deiner Ausgangsfolge. rand(n) ist hierbei eine zufällige Zahl zwischen 1 und n. swap erklärt sich glaube ich von selbst. Du müßtest dein Array nur mit den Zahlen 1 bis n initialisieren
-
für die schleifen kannste eine variable nehmen, den tausch mit xor-swap machen. dann hast du weniger variablen, aber was bringt das?
-
fricky schrieb:
für die schleifen kannste eine variable nehmen, den tausch mit xor-swap machen. dann hast du weniger variablen, aber was bringt das?
hi,
guck mal unter
Reasons for avoidance in practice
http://en.wikipedia.org/wiki/XOR_swap_algorithm
-
curb schrieb:
SideWinder schrieb:
Du überprüfst zwar, ob die Zahl bereits einmal vorgekommen ist - falls ja generierst du eine neue Zahl: Was aber wenn diese nun ebenfalls bereits vorkommt?
darum sollte ja j=0 die überprüfung neu starten
Schon, aber in
[quote="Curb"]... for(j=0;j<i;j++) { ... j=0; }
wird j (nach Beendigung des Schleifendurchlaufs) ja gleich wieder auf 1 gesetzt.
-
Danke für eure tipps !!
-
curb schrieb:
Danke für eure tipps !!
und wie hast du es jetzt gemacht, zeig doch mal den code!
-
ich mach es jetzt so...
void mischen(int* zahl) { srand(time(0)); int i,temp,t; for (i = 100; i > 0; i--) { t= rand()%8; temp = zahl[0]; zahl[0] = zahl[t]; zahl[t] = temp; } }
da ich von swap nichts finde und es besser aussieht als meine erste mischfunktion...(konstruktive kritik ist aber immer erwünscht)
obwohl ich sagen muss, mit der lösung bin ich ganz zu frieden..
-
ps:
ich könnte die schleife auch auf <8 verkürzen und statt zahl[0] auch zahl[i] verwenden...spreche ja von einem array[8]...
-
curb schrieb:
ps:
ich könnte die schleife auch auf <8 verkürzen und statt zahl[0] auch zahl[i] verwenden...spreche ja von einem array[8]...
Genauso meinte ich es auch. 100 mal brauchst du das nicht zu durchlaufen. Ich habe es eben mit folgendem Code getestet.
void mischen(int* zahl) { srand(time(0)); int temp, t; for (int i = 8; i > 0; i--) { t = rand() % i; temp = zahl[i - 1]; zahl[i - 1] = zahl[t]; zahl[t] = temp; } }
-
hab da mal nur ein anderes problem das ich nicht verstehe..
ich hab das auf char umgeschrieben...
void mischen(char* zahl) { srand(time(0)); int i; char temp,t; for (i = 100; i > 0; i--) { t= rand()%8; temp = zahl[0]; zahl[0] = zahl[t]; zahl[t] = temp; } }
und in der main:
int main(void) { int i; char zahl[8]={1,2,3,4,5,6,7,8}; char ein[8]; mischen(zahl); for (i=0;i<8;i++) { printf("%d",zahl[i]); } }
warum muss ich hier %d verwenden um meine zahlen ordentlich zu sehen bei einem char array??? denn bei %c oder %s kommt schwachsinn raus
-
ah sorry hab bemerkt, dass \0 fehlt im string bei der definition...
glaub das ist das problem
-
Habs nicht ausprobiert, aber es könnte durchaus daran liegen, daß das t ein int bleiben sollte
-
ich denke es ist im prinzip egal ob t ein integer oder ein char is...
-
Es ist im Prinzip auch egal. Aber der "Schwachsinn" könnte damit zusammenhängen, daß du Zahlen 1-8 bearbeitest was ja den ASCII-Codes des "Schwachsinns" entspricht