Array mit Zufallswerten füllen, jede zahl (von1-9)darf nur 1 mal vorhanden sein?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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! :)

nikolaiki  30.05.2016, 03:09

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.

2
TeeTier  30.05.2016, 21:27
@nikolaiki

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.

1

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);



nikolaiki  29.05.2016, 17:00

Sorry, der Link ist offenbar nicht mehr gültig

0

Welche Sprache benötigst du denn? In JS gibt es bereits die Funktion unique