PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 25 Zufallszahlen aber jede nur einmal vergeben...


Gast
2008-03-05, 20:00:50
Hallo alle,

ich habe ein Problem .. und zwar möchte ich ein Spiel schreiben und muss dafür in ein int array 25 Zufallszahlen reinschreiben ... jede Zahl (0-24) soll aber immer nur einmal vorkommen ...

im Moment sieht das ganze So aus:


srand(time(NULL));
do{
for(int i=0;i<24;i++)
{
kofferarray[i]= rand()%25;
}
}while(kofferarray[0]==kofferarray[1]||kofferarray[0]==kofferarray[2]||
kofferarray[0]==kofferarray[3]||kofferarray[0]==kofferarray[4]||
kofferarray[0]==kofferarray[5]||kofferarray[0]==kofferarray[6]||
kofferarray[0]==kofferarray[7]||kofferarray[0]==kofferarray[8]||
kofferarray[0]==kofferarray[9]||kofferarray[0]==kofferarray[10]||
kofferarray[0]==kofferarray[11]||kofferarray[0]==kofferarray[12]||
kofferarray[0]==kofferarray[13]||kofferarray[0]==kofferarray[14]||
kofferarray[0]==kofferarray[15]||kofferarray[0]==kofferarray[16]||
kofferarray[0]==kofferarray[17]||kofferarray[0]==kofferarray[18]||
kofferarray[0]==kofferarray[19]||kofferarray[0]==kofferarray[20]||
kofferarray[0]==kofferarray[21]||kofferarray[0]==kofferarray[22]||
kofferarray[0]==kofferarray[23]||kofferarray[0]==kofferarray[24]||
kofferarray[0]==kofferarray[25]||

kofferarray[1]==kofferarray[2]||kofferarray[1]==kofferarray[3]||
kofferarray[1]==kofferarray[4]||kofferarray[1]==kofferarray[5]||
kofferarray[1]==kofferarray[6]||kofferarray[1]==kofferarray[7]||
kofferarray[1]==kofferarray[8]||kofferarray[1]==kofferarray[9]||
kofferarray[1]==kofferarray[10]||kofferarray[1]==kofferarray[11]||
kofferarray[1]==kofferarray[12]||kofferarray[1]==kofferarray[13]||
kofferarray[1]==kofferarray[14]||kofferarray[1]==kofferarray[15]||
kofferarray[1]==kofferarray[16]||kofferarray[1]==kofferarray[17]||
kofferarray[1]==kofferarray[18]||kofferarray[1]==kofferarray[19]||
kofferarray[1]==kofferarray[20]||kofferarray[1]==kofferarray[21]||
kofferarray[1]==kofferarray[22]||kofferarray[1]==kofferarray[23]||
kofferarray[1]==kofferarray[24]||kofferarray[1]==kofferarray[25]||

kofferarray[2]==kofferarray[3]||kofferarray[2]==kofferarray[3]||
kofferarray[2]==kofferarray[5]||kofferarray[2]==kofferarray[5]||
kofferarray[2]==kofferarray[7]||kofferarray[2]==kofferarray[7]||
kofferarray[2]==kofferarray[9]||kofferarray[2]==kofferarray[9]||
kofferarray[2]==kofferarray[11]||kofferarray[2]==kofferarray[11]||
kofferarray[2]==kofferarray[13]||kofferarray[2]==kofferarray[13]||
kofferarray[2]==kofferarray[15]||kofferarray[2]==kofferarray[15]||
kofferarray[2]==kofferarray[17]||kofferarray[2]==kofferarray[17]||
kofferarray[2]==kofferarray[19]||kofferarray[2]==kofferarray[19]||
kofferarray[2]==kofferarray[21]||kofferarray[2]==kofferarray[21]||
kofferarray[2]==kofferarray[23]||kofferarray[2]==kofferarray[23]||
kofferarray[2]==kofferarray[25]||

kofferarray[3]==kofferarray[4]||kofferarray[3]==kofferarray[5]||
kofferarray[3]==kofferarray[6]||kofferarray[3]==kofferarray[7]||
kofferarray[3]==kofferarray[8]||kofferarray[3]==kofferarray[9]||
kofferarray[3]==kofferarray[10]||kofferarray[3]==kofferarray[11]||
kofferarray[3]==kofferarray[12]||kofferarray[3]==kofferarray[13]||
kofferarray[3]==kofferarray[14]||kofferarray[3]==kofferarray[15]||
kofferarray[3]==kofferarray[16]||kofferarray[3]==kofferarray[17]||
kofferarray[3]==kofferarray[18]||kofferarray[3]==kofferarray[19]||
kofferarray[3]==kofferarray[20]||kofferarray[3]==kofferarray[21]||
kofferarray[3]==kofferarray[22]||kofferarray[3]==kofferarray[23]||
kofferarray[3]==kofferarray[24]||kofferarray[3]==kofferarray[25]||

kofferarray[4]==kofferarray[5]||kofferarray[4]==kofferarray[6]||
kofferarray[4]==kofferarray[7]||kofferarray[4]==kofferarray[8]||
kofferarray[4]==kofferarray[9]||kofferarray[4]==kofferarray[10]||
kofferarray[4]==kofferarray[11]||kofferarray[4]==kofferarray[12]||
kofferarray[4]==kofferarray[13]||kofferarray[4]==kofferarray[14]||
kofferarray[4]==kofferarray[15]||kofferarray[4]==kofferarray[16]||
kofferarray[4]==kofferarray[17]||kofferarray[4]==kofferarray[18]||
kofferarray[4]==kofferarray[19]||kofferarray[4]==kofferarray[20]||
kofferarray[4]==kofferarray[21]||kofferarray[4]==kofferarray[22]||
kofferarray[4]==kofferarray[23]||kofferarray[4]==kofferarray[24]||
kofferarray[4]==kofferarray[25]||

kofferarray[5]==kofferarray[6]||kofferarray[5]==kofferarray[7]||
kofferarray[5]==kofferarray[8]||kofferarray[5]==kofferarray[9]||
kofferarray[5]==kofferarray[10]||kofferarray[5]==kofferarray[11]||
kofferarray[5]==kofferarray[12]||kofferarray[5]==kofferarray[13]||
kofferarray[5]==kofferarray[14]||kofferarray[5]==kofferarray[15]||
kofferarray[5]==kofferarray[16]||kofferarray[5]==kofferarray[17]||
kofferarray[5]==kofferarray[18]||kofferarray[5]==kofferarray[19]||
kofferarray[5]==kofferarray[20]||kofferarray[5]==kofferarray[21]||
kofferarray[5]==kofferarray[22]||kofferarray[5]==kofferarray[23]||
kofferarray[5]==kofferarray[24]||kofferarray[5]==kofferarray[25]||

kofferarray[6]==kofferarray[7]||kofferarray[6]==kofferarray[8]||
kofferarray[6]==kofferarray[9]||kofferarray[6]==kofferarray[10]||
kofferarray[6]==kofferarray[11]||kofferarray[6]==kofferarray[12]||
kofferarray[6]==kofferarray[13]||kofferarray[6]==kofferarray[14]||
kofferarray[6]==kofferarray[15]||kofferarray[6]==kofferarray[16]||
kofferarray[6]==kofferarray[17]||kofferarray[6]==kofferarray[18]||
kofferarray[6]==kofferarray[19]||kofferarray[6]==kofferarray[20]||
kofferarray[6]==kofferarray[21]||kofferarray[6]==kofferarray[22]||
kofferarray[6]==kofferarray[23]||kofferarray[6]==kofferarray[24]||
kofferarray[6]==kofferarray[25]||

kofferarray[7]==kofferarray[8]||kofferarray[7]==kofferarray[9]||
kofferarray[7]==kofferarray[10]||kofferarray[7]==kofferarray[11]||
kofferarray[7]==kofferarray[12]||kofferarray[7]==kofferarray[13]||
kofferarray[7]==kofferarray[14]||kofferarray[7]==kofferarray[15]||
kofferarray[7]==kofferarray[16]||kofferarray[7]==kofferarray[17]||
kofferarray[7]==kofferarray[18]||kofferarray[7]==kofferarray[19]||
kofferarray[7]==kofferarray[20]||kofferarray[7]==kofferarray[21]||
kofferarray[7]==kofferarray[22]||kofferarray[7]==kofferarray[23]||
kofferarray[7]==kofferarray[24]||kofferarray[7]==kofferarray[25]||

kofferarray[8]==kofferarray[9]||
kofferarray[8]==kofferarray[10]||kofferarray[8]==kofferarray[11]||
kofferarray[8]==kofferarray[12]||kofferarray[8]==kofferarray[13]||
kofferarray[8]==kofferarray[14]||kofferarray[8]==kofferarray[15]||
kofferarray[8]==kofferarray[16]||kofferarray[8]==kofferarray[17]||
kofferarray[8]==kofferarray[18]||kofferarray[8]==kofferarray[19]||
kofferarray[8]==kofferarray[20]||kofferarray[8]==kofferarray[21]||
kofferarray[8]==kofferarray[22]||kofferarray[8]==kofferarray[23]||
kofferarray[8]==kofferarray[24]||kofferarray[8]==kofferarray[25]||

kofferarray[9]==kofferarray[10]||kofferarray[9]==kofferarray[11]||
kofferarray[9]==kofferarray[12]||kofferarray[9]==kofferarray[13]||
kofferarray[9]==kofferarray[14]||kofferarray[9]==kofferarray[15]||
kofferarray[9]==kofferarray[16]||kofferarray[9]==kofferarray[17]||
kofferarray[9]==kofferarray[18]||kofferarray[9]==kofferarray[19]||
kofferarray[9]==kofferarray[20]||kofferarray[9]==kofferarray[21]||
kofferarray[9]==kofferarray[22]||kofferarray[9]==kofferarray[23]||
kofferarray[9]==kofferarray[24]||kofferarray[9]==kofferarray[25]||

kofferarray[10]==kofferarray[11]||
kofferarray[10]==kofferarray[12]||kofferarray[10]==kofferarray[13]||
kofferarray[10]==kofferarray[14]||kofferarray[10]==kofferarray[15]||
kofferarray[10]==kofferarray[16]||kofferarray[10]==kofferarray[17]||
kofferarray[10]==kofferarray[18]||kofferarray[10]==kofferarray[19]||
kofferarray[10]==kofferarray[20]||kofferarray[10]==kofferarray[21]||
kofferarray[10]==kofferarray[22]||kofferarray[10]==kofferarray[23]||
kofferarray[10]==kofferarray[24]||kofferarray[10]==kofferarray[25]||

kofferarray[11]==kofferarray[12]||kofferarray[11]==kofferarray[13]||
kofferarray[11]==kofferarray[14]||kofferarray[11]==kofferarray[15]||
kofferarray[11]==kofferarray[16]||kofferarray[11]==kofferarray[17]||
kofferarray[11]==kofferarray[18]||kofferarray[11]==kofferarray[19]||
kofferarray[11]==kofferarray[20]||kofferarray[11]==kofferarray[21]||
kofferarray[11]==kofferarray[22]||kofferarray[11]==kofferarray[23]||
kofferarray[11]==kofferarray[24]||kofferarray[11]==kofferarray[25]||

kofferarray[12]==kofferarray[13]||
kofferarray[12]==kofferarray[14]||kofferarray[12]==kofferarray[15]||
kofferarray[12]==kofferarray[16]||kofferarray[12]==kofferarray[17]||
kofferarray[12]==kofferarray[18]||kofferarray[12]==kofferarray[19]||
kofferarray[12]==kofferarray[20]||kofferarray[12]==kofferarray[21]||
kofferarray[12]==kofferarray[22]||kofferarray[12]==kofferarray[23]||
kofferarray[12]==kofferarray[24]||kofferarray[12]==kofferarray[25]||

kofferarray[13]==kofferarray[14]||kofferarray[13]==kofferarray[15]||
kofferarray[13]==kofferarray[16]||kofferarray[13]==kofferarray[17]||
kofferarray[13]==kofferarray[18]||kofferarray[13]==kofferarray[19]||
kofferarray[13]==kofferarray[20]||kofferarray[13]==kofferarray[21]||
kofferarray[13]==kofferarray[22]||kofferarray[13]==kofferarray[23]||
kofferarray[13]==kofferarray[24]||kofferarray[13]==kofferarray[25]||

kofferarray[14]==kofferarray[15]||
kofferarray[14]==kofferarray[16]||kofferarray[14]==kofferarray[17]||
kofferarray[14]==kofferarray[18]||kofferarray[14]==kofferarray[19]||
kofferarray[14]==kofferarray[20]||kofferarray[14]==kofferarray[21]||
kofferarray[14]==kofferarray[22]||kofferarray[14]==kofferarray[23]||
kofferarray[14]==kofferarray[24]||kofferarray[14]==kofferarray[25]||

kofferarray[15]==kofferarray[16]||kofferarray[15]==kofferarray[17]||
kofferarray[15]==kofferarray[18]||kofferarray[15]==kofferarray[19]||
kofferarray[15]==kofferarray[20]||kofferarray[15]==kofferarray[21]||
kofferarray[15]==kofferarray[22]||kofferarray[15]==kofferarray[23]||
kofferarray[15]==kofferarray[24]||kofferarray[15]==kofferarray[25]||

kofferarray[16]==kofferarray[17]||
kofferarray[16]==kofferarray[18]||kofferarray[16]==kofferarray[19]||
kofferarray[16]==kofferarray[20]||kofferarray[16]==kofferarray[21]||
kofferarray[16]==kofferarray[22]||kofferarray[16]==kofferarray[23]||
kofferarray[16]==kofferarray[24]||kofferarray[16]==kofferarray[25]||

kofferarray[17]==kofferarray[18]||kofferarray[17]==kofferarray[19]||
kofferarray[17]==kofferarray[20]||kofferarray[17]==kofferarray[21]||
kofferarray[17]==kofferarray[22]||kofferarray[17]==kofferarray[23]||
kofferarray[17]==kofferarray[24]||kofferarray[17]==kofferarray[25]||

kofferarray[18]==kofferarray[19]||
kofferarray[18]==kofferarray[20]||kofferarray[18]==kofferarray[21]||
kofferarray[18]==kofferarray[22]||kofferarray[18]==kofferarray[23]||
kofferarray[18]==kofferarray[24]||kofferarray[18]==kofferarray[25]||

kofferarray[19]==kofferarray[20]||kofferarray[19]==kofferarray[21]||
kofferarray[19]==kofferarray[22]||kofferarray[19]==kofferarray[23]||
kofferarray[19]==kofferarray[24]||kofferarray[19]==kofferarray[25]||

kofferarray[20]==kofferarray[21]||
kofferarray[20]==kofferarray[22]||kofferarray[20]==kofferarray[23]||
kofferarray[20]==kofferarray[24]||kofferarray[20]==kofferarray[25]||

kofferarray[21]==kofferarray[22]||kofferarray[21]==kofferarray[23]||
kofferarray[21]==kofferarray[24]||kofferarray[21]==kofferarray[25]||

kofferarray[22]==kofferarray[23]||
kofferarray[22]==kofferarray[24]||kofferarray[22]==kofferarray[25]||

kofferarray[23]==kofferarray[24]||kofferarray[23]==kofferarray[25]||

kofferarray[24]==kofferarray[25]);


ich hoffe, es gibt eine einfachere Variante ... und eine die keine Endlosschleife liefert :D

P.S Ja, ich hatte Zeit ...

MfG Disi

Trap
2008-03-05, 20:14:26
0-24 in zufälliger Reihenfolge geht so (nennt sich "mischen" oder auf Englisch "shuffling", die Variante nennt man meist "knuth shuffle")
int x[25];
for(int i=0;i<25;++i)x[i]=i;
for(int i=0;i<25;++i)swap(x[i],x[randomInRange(i,25)]);
randomInRange gibt es leider nicht fertig in der Standardbibliothek, guck in http://www.boost.org/libs/random/ wie man es richtig implementiert.

In C++ gibt es die Funktion schon fertig, std::random_shuffle().

Edit: Vertauschen der Elemente vergessen...

Monger
2008-03-05, 20:26:11
Oder alternativ auf Wikipedia (http://en.wikipedia.org/wiki/Knuth_shuffle), wo sie meiner Meinung nach sehr gut den Fisher Yates Algorithmus - inklusive aller Stolperfallen - erklärt haben.

RMC
2008-03-05, 20:33:11
Also wenn ich es selber machen müsste, hätt ich es spontan so gemacht:

Du schreibst in ein dynamisches Array 25 Zufallszahlen (zB 1-24...wenn ich das jetzt richtig verstanden hab was du machen willst), suchst dir immer einen zufälligen Index heraus (random von 0 bis arraylength-1), und löschst diesen Eintrag nachher aus dem Array.

Trap
2008-03-05, 20:35:23
Die Erklärung bei Wikipedia ist gut, nur würd ich die Schleife vorwärts zählen lassen, das macht allerdings die Zufallszahlengenerierung komplizierter.

Trap
2008-03-05, 20:37:19
Du schreibst in ein dynamisches Array 25 Zufallszahlen (zB 1-24...wenn ich das jetzt richtig verstanden hab was du machen willst), suchst dir immer einen zufälligen Index heraus (random von 0 bis arraylength-1), und löschst diesen Eintrag nachher aus dem Array.
Das macht der Algorithmus, aber in-place. Alle Elemente vor dem Schleifenzähler sind die noch verfügbaren Zahlen, alle danach die schon ausgewählten (bei der Implementierung auf Wikipedia).

Gast
2008-03-05, 20:40:31
Hier arbeitet man am besten mit Loop Kaskaden

Die entsprechende hussy-Funktion gestaltet sich wie folgt:


int* hussy(unsigned int s) {
srand(time(0));
unsigned int m=s;
int* nn = new int[s];
switch(--s) {
while(s+1) {
default:
s[nn]=s--;
continue;
}
case 0:
break;
}
unsigned int i(++s);
switch(s) {
for(;i<m;i++) {
case 0:
int lol=i[nn];
int r= rand()%m;
i[nn]=nn[r];r[nn]=lol;
}
default:return nn;
}
return nn;
}

int main () {

unsigned int zolo = 14;
int* daA = hussy(zolo);
for(int i=0;i<zolo;i++) std::cout<<i[daA]<<std::endl;
delete [] daA;
return 0;
}

RMC
2008-03-05, 20:41:44
Das macht der Algorithmus, aber in-place. Alle Elemente vor dem Schleifenzähler sind die noch verfügbaren Zahlen, alle danach die schon ausgewählten (bei der Implementierung auf Wikipedia).

I see...so funktionierts auch ohne dyn. Arrays, indem die Range für die Zufallszahlen immer verringert wird und die rausgepickten Werte hinten angereiht werden. Auch nicht schlecht.

#44
2008-03-05, 21:03:34
Ich hätte die Zahlen von 0-24 nacheinander an eine zufällige Position im Array geschrieben, sofern diese leer ist. Nicht sehr schön, aber einfach auszudenken.

Kenny1702
2008-03-05, 22:48:58
Ich würde einfach mit 2 Arrays arbeiten, eins wird von 0 bis 24 gefüllt, das andere mit Zufallszahlen beschrieben. Dann wird das Array mit den Zufallszahlen sortiert und entsprechend ergibt sich die Reihenfolge im anderen Array.


Random random=new Random();
int [] original = new int[25];
int [] sort = new int[25];
for(int i=0;i<25;i++) original[i]=i;
for(int i=0;i<25;i++) sort[i]=random.nextInt(1000);
//Sortiere
int copy1, copy2;
int min;
for(int i=0; i<24; i++){
min=i;
for(int j=i+1; j<25; j++){
if(sort[min]>sort[j]){
min=j;
}
}
copy2=sort[i];
copy1=original[i];
sort[i]=sort[min];
sort[min]=copy2;
original[i]=original[min];
original[min]=copy1;
}

DocEW
2008-03-07, 09:56:49
Willst du 25 verschiedene Zufallszahlen, oder willst du eine zufällige Reihenfolge der Zahlen von 0-24? Ich habe ersteres verstanden, aber die Lösungen hier beantworten, letzteres, soweit ich das sehe. :)

P.S.: OK, ich sehe gerade, dein ursprünglicher Code liefert ja auch nur Zufallszahlen von 0 bis 24. Insofern suchst du wohl tatsächlich eine Permutation der Zahlen von 0 bis 24, was ja die bisherigen Vorschläge leisten.

Neomi
2008-03-07, 20:35:59
ich hoffe, es gibt eine einfachere Variante ... und eine die keine Endlosschleife liefert :D

Eine Endlosschleife ist das nicht wirklich (wenn man mal von "echten" Zufallszahlen ausgehen würde). Allerdings wird nach einem Durchlauf die äußere Schleife nur mit einer Chance von 1:15511210043330985983999999 verlassen. ;)