http://www.pronix.de -> Forum -> C-Programmieren -> Code-Schnipsel

Unterseiten

Code-Schnipsel

Moderatoren: broesel, Martin Conrad, Patrick

Thema: [EDIT] - Echte Zufallszahlen

  • (nur registrierte Mitglieder)

[EDIT] - Echte Zufallszahlen

swlx87 am 23.09.2007 um 10:46

Vor einiger Zeit war ich wie wild auf der Suche nach einem Wuerfel Generator fuer Linux.
Habe kurzerhand die Suche aufgegeben und mir selbst ein Programm in C geschrieben:


/****************************************
 *  randuser.c                          *
 *  Lizens: GPL                         *
 *  Autor: swlx87                       *
 *  Zufallszahl nach Eingabe des Users  *
 ****************************************/


#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int zahl;
int zufallszahl;

/*Hauptfunktion main ()**************************/
int main () {

  printf ( "Zahl: " );
  scanf  ( "%d", &zahl );

  shake_it ();

  printf ( "Zahl 0-%d: %d\n\n ",zahl, zufallszahl );

  return 0;
}

/*Funktion shake_it ()*****************************/
int shake_it () {

  srand ( ( unsigned ) time ( NULL ) );
  zufallszahl = rand () % zahl;

  return zahl;
}


Und hier das Programm an einem praktischen Beispiel:

/***************************************
 * diceroller.c                        *
 * Lizens: GPL                         *
 * Autor: swlx87                       *
 * Die Berechnung echter Zufallszahlen *
 * anhand eines Wuerfelbeispieles.     *
 ***************************************/

#include <stdio.h>
#include <stdlib.h>  
#include <time.h>    

#define W_100 100
#define W_20   20
#define W_12   12
#define W_6     6
#define W_4     4

int ergebnis;
int tmp;

/*Hauptfunktion **********************************/
int main () {
  
  menue ();
  
  return 0;
}

/*Funktion menue () *****************************/
int menue () {

  printf ( " ~ Wuerfel Programm ~\n" );
  printf ( " W 100   <1>\n" );
  printf ( " W  20   <2>\n" );
  printf ( " W  12   <3>\n" );
  printf ( " W   6   <4>\n" );
  printf ( " W   4   <5>\n" );
  printf ( " Auswahl: ");
  scanf  ( "%d", &tmp );

    switch ( tmp ) {

      case 1: tmp = W_100; 
              roll ();     /
	      break;

      case 2: tmp = W_20;
              roll ();
	      break;

      case 3: tmp = W_12;
              roll ();
	      break;

      case 4: tmp = W_6;
              roll ();
	      break;

      case 5: tmp = W_4;
              roll ();
	      break;

     default: printf ( " Ungueltige Eingabe. \n");
              main ();
	      break;
    }
 
  return tmp;
}

/* Funktion roll () *****************************/
int roll () {

  srand( ( unsigned ) time ( NULL ) ); 
  ergebnis = rand () % tmp;            /* rand ermittelt eine Zufaellige Zahl von tmp */

  printf ( "Wuerfel: %d  Ergebnis: %d\n\n ", tmp, ergebnis );

  return tmp;
}
 

Re: Echte Zufallszahlen

Patrick (Moderator) am 27.09.2007 um 17:04

Zu diesem Thema hat mir http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo38.php recht gut gefallen.

--
To follow the path: look to the master, follow the master, walk with the master, see through the master, become the master.

 

Re: Echte Zufallszahlen

fukurokuju am 27.11.2007 um 00:48

Was genau meinst du hier mit "echt"?
 

Re: Echte Zufallszahlen

Hanse am 12.12.2007 um 15:39

Hab deinen Beispiel-Code mal bisl geändert.


#include <stdio.h>
#include <stdlib.h>  
#include <time.h>    

//#define W_100 100
#define W_20   20
#define W_12   12
#define W_10   10
#define W_8	8
#define W_6     6
#define W_4     4
#define W_3	3

int roll();
int menue();

int ergebnis;
int tmp;

/*Hauptfunktion **********************************/
int main () {
  
  menue ();
  
  return 0;
}

/*Funktion menue () *****************************/
int menue () {

  do
  {
  printf ( " ~ Wuerfel Programm ~\n" );
  //printf ( " W 100   <1>\n" );
  printf ( " W  20   <1>\n" );
  printf ( " W  12   <2>\n" );
  printf ( " W  10   <3>\n" );
  printf ( " W   8   <4>\n" );
  printf ( " W   6   <5>\n" );
  printf ( " W   4   <6>\n" );
  printf ( " W   3   <7>\n" );
  printf(  " Quit	 <99>\n" );
  printf ( " Auswahl: ");
  scanf  ( "%d", &tmp );

    switch ( tmp ) {

      /*case 1: tmp = W_100; 
              roll ();     /
	      break;*/

      case 1: tmp = W_20;
              roll ();
	      break;

      case 2: tmp = W_12;
              roll ();
	      break;
      
      case 3: tmp = W_10;
              roll ();
      	  break;

      case 4: tmp = W_8;
              roll ();
	      break;

      case 5: tmp = W_6;
              roll ();
	      break;
	      
      case 6: tmp = W_4;
              roll ();
      	  break;
      	  
      case 7: tmp = 3;
              roll ();
      	  break;
      
      case 99: tmp = 99;
      	  printf("Programmende!!!\n");
      	  exit(0);;

     default: printf ( "Ungueltige Eingabe. \n");
              main ();
	      break;
    }
  }while(tmp!=99);
  
  return tmp;
}

/* Funktion roll () *****************************/
int roll () {

  srand( ( unsigned ) time ( NULL ) ); 
  ergebnis = rand () % tmp;            /* rand ermittelt eine Zufaellige Zahl von tmp */

  printf ( "Wuerfel: %d  Ergebnis: %d\n\n ", tmp, ergebnis+1 );//+1 weil die Null sonst mitzaehlt

  return tmp;
}


 

[EDIT] - Re: Echte Zufallszahlen

scusi71 am 20.09.2008 um 23:31

Zwar ist der C "Zufallszahlengenerator" nicht zu empfehlen, aber ihn dann auch noch für jede Zufallszahl mittels time(NULL) neu zu initialisieren, das ruiniert ihn dann doch vollständig. Das Ergebniss ist eine Folge von modifizierten Zeitwerten, und da die Auflösung von time_t nicht wirklich hoch ist - verglichen mit der Geschwindigkeit der Maschine - dürften die Ergebnisse für schnell wiederholte Aufrufe identisch sein.

Der srand Aufruf muss hier auf jeden Fall entfernt werden. Ausserdem ist bekannt das der Modulo Ansatz schlechte Ergebnisse bei dem von rand gewöhnlich verwendeten Verfahren liefert aber es gibt ja noch einen anderen Weg.



#include <stdlib.h>

/*
 * Simuliere einen Würfelwurf mit einem sides seitigen Würfel.
 */
int rollDice (const int sides)
{ 
    return (1 + (int)(sides * (rand()/(RAND_MAX+1.0))));
} 
 
  • (nur registrierte Mitglieder)