Array mit Zufallswerten füllen, jede zahl (von1-9)darf nur 1 mal vorhanden sein?
4 Antworten
![](https://images.gutefrage.net/media/default/user/0_nmmslarge.png?v=1438863662000)
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! :)
![](https://images.gutefrage.net/media/default/user/0_nmmslarge.png?v=1438863662000)
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.
![](https://images.gutefrage.net/media/default/user/8_nmmslarge.png?v=1551279448000)
Fülle ein Array mit Zahlen von 1-9 und schreibe eine Vergleichsfunktion für die Array Sortiermethode die mit Zufallszahlen arbeitet.
![](https://images.gutefrage.net/media/user/nikolaiki/1444748875_nmmslarge.jpg?v=1444748875000)
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);
![](https://images.gutefrage.net/media/user/nikolaiki/1444748875_nmmslarge.jpg?v=1444748875000)
![](https://images.gutefrage.net/media/default/user/8_nmmslarge.png?v=1551279448000)
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.