Array mit Zufallswerten füllen, jede zahl (von1-9)darf nur 1 mal vorhanden sein?
4 Antworten
Lösung: Array mit Zahlen 1 bis 9 in normaler aufsteigender Reihenfolge füllen, und dann shufflen.
Da du von C sprichst sei noch darauf hingewiesen, dass rand() eine verdammt schlechte Verteilung hat. Bau dir lieber schnell einen eigenen kleinen Zufallszahlengenerator mit XOR-Shift oder nimm die Mersenne-Twister Referenzimplementierung. (Code dazu bei Google.)
Ansonsten, auf die Schnelle:#include <stdio.h>
#include <stdlib.h>
#define ARR_LEN ((size_t)9)
void dump_arr(const char version, const int *arr) {
printf("%c:", version);
for (size_t i = 0; i < ARR_LEN; ++i) {
printf(" %d", arr[i]);
}
printf("\n");
}
int main(void) {
/* Initialize */
int arr[ARR_LEN] = {0};
for (size_t i = 0; i < ARR_LEN; ++i) {
arr[i] = (int)(1 + i);
}
dump_arr('A', arr);
/* Shuffle */
srand(12345);
for (size_t i = 0; i < ARR_LEN; ++i) {
size_t idx = rand() % ARR_LEN;
arr[i] ^= arr[idx];
arr[idx] ^= arr[i];
arr[i] ^= arr[idx];
}
dump_arr('B', arr);
return EXIT_SUCCESS;
}
Die Ausgabe sieht dann z. B. so aus:
A: 1 2 3 4 5 6 7 8 9
B: 6 2 0 9 8 5 7 1 4
Wenn du bei jedem Programmstart eine andere zufällige Reihenfolge haben willst, solltest du den Pseudo-Zufallszahlen-Generator mit der Systemzeit oder ähnlichem initialisieren (also die srand() Funktion).
Die Funktion dump_arr() dient nur zu Testzwecken, also kannst du die natürlich rausschmeißen.
Und anstelle der XOR-Vertauschung kannst du natürlich auch eine temporäre Variable benutzen, wenn dir das lieber ist. Mache ich auch meistens so, aber irgendwie war mir gerade nach XOR. :)
Schönen Tag noch! :)
Au weia, da hast du natürlich Recht. Dass mir so ein peinlicher Anfängerfehler unterläuft ... tzzz ...
Vielen Dank für den wichtigen Hinweis! Hätte ich eigentlich wissen müssen.
Fülle ein Array mit Zahlen von 1-9 und schreibe eine Vergleichsfunktion für die Array Sortiermethode die mit Zufallszahlen arbeitet.
Mach dir erst ein Array mit den Zahlen von 1 - 9 als Zahlenvorrat und mische dann. Der Mischalgorithmus ist hier beschrieben:
http://de.wikibooks.org/wiki/Einf%C3%BChrung_in_die_Informatik:_Mischen
var stapelA= new Array(1,2,3,4,5,6,7,8,9); // Zahlenvorrat
var stapelB= new Array(); // Ergebnisarray
var groeseVonB = 3;
for (var i = 0; stapelA.length > 0 && i< groeseVonB ; i++)
{
var zuf= Math.floor(Math.random()*(stapelA.length)); /* zufaellige Zahl */
stapelB.push(stapelA[zuf]); /* lege auf Stapel B */
stapelA[zuf]= stapelA[stapelA.length-1] /* entferne aus Stapel A */
stapelA.pop();
}
alert (stapelB);
Welche Sprache benötigst du denn? In JS gibt es bereits die Funktion unique
Wirklich nett, die xor Vertauschung kannte ich noch nicht. Kleiner Schönheitsfehler: Wenn das zu tauschende Arrayelement gleichzeitig Quelle und Ziel ist, kommt Null heraus, weil a xor a = 0. Das sieht man auch in dem Testdump an der dritten Stelle. Deshalb darf man in diesen Fällen nicht tauschen.