rand() nicht shuffle genug



  • mahlzeit

    folgendes

    ich uebergeb der funktion rand() die zeit mit srand
    denk das ist die typische herangehensweise

    nur wenn rand eine random zahl zwischen 1 und 10 bringen soll, dauert es schon sehr lange bis mal ne andere zahl rauskommt

    es geht darum das es ein kleines programm ist was immer wieder neu gestartet wird
    und dadurch faengt immer gleich an irgendwie

    kann man rand noch mehr shuffeln ?

    m_minFiles = 1;
    m_maxFiles = 10;
    
    int number = RandomNumber( m_minFiles, m_maxFiles );
    
    int WALL::RandomNumber(int min, int max)
    {
    	double number = ( ( (double) rand() / (double) RAND_MAX ) * max + min );
    	return ( (int)number +1 );
    }
    

    die berechnung mit min/max hab ich mir aus der MSDN abgeschaut - "frueher" hatte ich immer mot modulo gearbeitet, wird aber das selbe ergeben

    rand wird bei jeden programmlauf nur einmal aufgerufen direkt am start



  • Mr Evil schrieb:

    ich uebergeb der funktion rand() die zeit mit srand

    Dieser wirre Satz sieht im Code wie aus? Ich vermute da Unfug.

    Deine Formel ist auch Mumpitz. Klappt so nur, wenn min 1 ist.



  • hab das nu so, weiss aber ne ob das nicht ein zu teures programm ist

    int WALL::RandomNumber(int min, int max)
    {
    	double count = ( ( (double) rand() / (double) RAND_MAX ) * 10 + 1 );
    	double number;
    	for( int x=0; x<=(int) count; x++ )
    		number = ( ( (double) rand() / (double) RAND_MAX ) * max + min );
    
    	return ( (int)number +1 );
    }
    

    'dazuedit

    srand( (unsigned)time( NULL ) );
    

    so natuerlich, die formel hab ich direkt aus der MSDN kopiert, und min ist bei mir immer 1

    'nochmal dazuedit

    ok, das geht natuerlich auch, ist auch sinnvoller, so wirds mehr shuffle

    int WALL::RandomNumber(int min, int max)
    {
    	double number;
    	for( int x=0; x<=3 ; x++ )
    		number = ( ( (double) rand() / (double) RAND_MAX ) * max + min );
    
    	return ( (int)number +1 );
    }
    


  • Mr Evil schrieb:

    srand( (unsigned)time( NULL ) );
    

    Und wie (vor allem: wie oft) wird das ausgeführt?



  • einmal direkt am start
    genau wie rand
    da es ein kleines programm ist, welches man oefter startet ist es notwendig das gleich das erste ergebnis je anders ist

    'dazuedit

    wie ich schon sagte
    es ist ein kleines programm
    das wird einmal gestartet - holt ne shuffle zahl und beendet schon wieder
    je nachdem wie man moechte ruft man das programm auf und nimmt sich ne neue zahl

    das kann manchmal nichtmal ne sekunde danach sein wo es zuerst bereits beendet ist, manchmal ne minute dazwischen und manchmal mehr

    je nachdem
    wenn ich das programm das erste mal aufruf, bekomm ich zb ne 6
    dann ruf ich es gleich nochmal auf und bekomm wieder ne 6
    10min spaeter dann bekomm ich erst ne andere zahl

    da halt die systemzeit an rand uebergeben wird, denk cih liegt es daran

    hab das nu so geloest das ich rand absichtlich oft aufruf, damit bei den einen start die zahl immer anders ist - schon klappts



  • Ich hab' da mal an eine etwas abwegigere Möglichkeit gedacht:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int get_random_number( ) {
    	srand( (unsigned int )( time( 0 ) ) + rand( ) );
    	return rand( );
    }
    
    int main( )
    {
    	for( int i = 0; i < 100; ++i ) // simuliert deine Aufrufe schnell nacheinander
    		printf( "%i, ", get_random_number( ) );
    
    	printf( "%i\n", get_random_number( ) );
    }
    

    Greetz, Swordfish


Anmelden zum Antworten