[c] Zufall Alphabet[array]?

mmp05

Ensign
Registriert
Okt. 2005
Beiträge
209
Servüs,

Ich brauch einige Zeilen Programmcode in c , welche mir ein zuffälliges Element aus einem Alphabet Array auspuckt:
Ungefähr so:

char Alphabet[26];

Alphabet[0]='a';
Alphabet[1]='b';
Alphabet[2]='c';
...
...
Alphabet[23]='x';
Alphabet[24]='y';
Alphabet[25]='z';


Den Array mit dem Alphabet zu initialisieren geht doch auch mit einer Schleife nicht?
Man muss doch von der ASCII-Tabelle aus immer eins hochzählen .... aber wie?
 
Wenn ich das Richtig in Erinnerung habe, setze einfach eine for-schleife à la
Code:
*böser Code, da falsch*
for (i=1; i<26 ;i++) {
buchstabe = 'a';
Alphabet[i]=buchstabe;
buchstabe++;
}
Für die Zufalls-Zahlen benutze man die Funktion rand() oder srand() oder ähnliches...

\edit schau zum S!lenceR, das Beispiel ist komplett und richtig, auch wenn es nicht unsere Aufgabe ist, deine HAs zu lösen...
 
Zuletzt bearbeitet von einem Moderator:
wenn du die initialisierung fuer buchstabe aus der schleife rausnimmst koennte sogar ein hut draus werden ...
ausserdem startet i bei 0 und geht bis 25

das ist allerdings jetzt noch nicht zufaellig ... jetzt wuerde ich das einfach noch permutieren ... zb per rand()%26 2mal ne zufallszahl holen und die beiden eintraege dann vertauschen ... ist natuerlich nur pseudorandom, aber setzt auf die lsg auf, die götterwind vorgeschlagen hat.
 
Zuletzt bearbeitet:
Bis auf nen kleinen Bug hat Götterwind recht...

Allerdings muss die Initialisierung des Startwerts ausserhalb der Schleife erfolgen, sonst würde immer nur 'a' drin stehen...

Code:
char Alphabet[26];
    
char cValue = 'a';

for(int i=0; i < 26; i++)
    Alphabet[i] = cValue++;

Für den Zufallsgenerator einfach srand( (unsigned)time( NULL ) ) irgendwo am Anfang des Programms aufrufen, um den Zufallszahlengenerator zu initialisieren mit der Systemzeit und via rand() % 26 eine Zufallszahl zwischen 0 .. 25 erzeugen lassen
 
Zuletzt bearbeitet von einem Moderator:
Ich weis, ich habe heute zuviel mit Code zugebracht und danach noch Theater, das war zuviel. Es sollte ja auch nur ein kurzes Beispiel werden. Ist natürlich ein böser Bug, die Initialisierung mit reinzuschreiben, sollte mir eigentlich nicht passieren...

Falls jemand mal mehr als nur die Standart-Pseudo-Randoms (oder sehr viele) braucht, sollte mal in den Numerical Recipes for C reinschauen. Aber das geht für das Beispiel etwas viel zu weit hinnaus.
 
Hehe, das Problem kommt mir irgendwie bekannt vor ;)
Aber danke für den Lektürentip, hab da direkt was bei gefunden was ich gerade gebrauchen kann für mein derzeitiges Projekt in Bezug auf Fast Fourier Transformation... Werd das morgen mal direkt ausprobieren.
 
Code:
char c_alphabet[26];
char c_tmp_alphabet[26];
int i=0;
for(;i<26;i++){
   c_tmp_alphabet[i]='a'+i;
} //erstmal nur Alphabet erzeugt ... wie gehabt

for(i=25;i>=0;i--){
   int i_new_pos = srand()%(i+1);
   c_alphabet[i]=c_tmp_alphabet[i_new_pos];
   c_tmp_alphabet[i_new_pos]=c_tmp_alphabet[i];
} // das erzeugte Alphabet wird nun per random ins das Zielalphabet eingefügt
 
Zuletzt bearbeitet:
So .... Habs nun wie folgt gelöst:

Code:
#include <stdio.h>

void main(void)
{
     int i;
     int ZufallZahl, booljain;
     char Alphabet[27];
     char Buchstabe;
     char nochmal, ja, nein;

     //Alphabet initialisieren
    for(i=0; i <= 25; i++)
    {
        Alphabet[i]='A'+i;
    }
    

    do
    {
       srand( (unsigned)time(NULL));    
       ZufallZahl = rand() % 26;

           Buchstabe = Alphabet[ZufallZahl];
           printf ("\n\n\tBUCHSTABE: %c",Buchstabe);
       
               printf("\n\n\nMoechten sie noch einmal Zocken [N || J] \?");
               scanf("%c",&nochmal);
       
               if (nochmal == 'N')
               {
               booljain = 0;
               }
               else
               {
               booljain = 1;
               }
       fflush(stdin);
    }
    while (booljain == 1);

  fflush(stdin);
  getchar();
}

Danke für eure Hilfe ... hab sogar was dazugelernt ^^

Hier noch der ansporn für das Programm ...
Mei Freundin hatte vorgeschlagen Stadt Land Fluss zu Zocken :) (jaja ich weis ^^)
Da ich Ihr nicht traue und wir nur zu zweit sind .... Es musste ein Außenstehender unparteischer her ... was eignet sich da besser als ein Programm?
 
Zuletzt bearbeitet von einem Moderator: (Bitte die Code Tags verwenden...)
Code:
[COLOR="RoyalBlue"]void[/COLOR] main(void)
Ist ein GANZ GANZ böses Ding! Hier darf der Compiler eigentlich alles machen, was er will! Mach mal:
Code:
[COLOR="RoyalBlue"]int[/COLOR] main(void)
 
Viel böser ist das hier:
Code:
fflush(stdin);

Eingabestreams kann man nicht flushen. Wohin auch. Wir sind der Abnehmer. Das ist undefiniertes Verhalten. (während void main einfach nur nich kompilieren darf und nie durfte)

Was man meistens will, dass alles was im Eingabestream steht gelöscht wird, ist genauso falsch und eigentlich immer ein falsches Verständnis der Eingabe. Wenn hinter der Eingabe nämlich ein File oder eine Pipe hängt anstatt die Tastatur, hat man ein dummes Problem, wenn man einfach alles wegwirft. Gerade unter Linux ist es absolut üblich, Daten einfach hin und her zu pipen.
 
Zurück
Oben