About random numbers

White Dragon

New member
What do you think about my random generator?
This is becouse rand() isnt a true random generator...

Code:
int get_rand_seed() {
    int seed = 0, tmp = 0;
    char rf = "";

    seed = ov("ticks")&rand();
    tmp = seed;
    seed = seed << 16;
    tmp = tmp >> 16;

    if ( getentity(0) != NULL() ) {
        rf = getentity(0)+"";
        rf = substr(rf,1,strlength(rf)-1);
        rf = to_float(rf);
        seed /= ov("elapsed_time");
        tmp = tmp | rf;
    } else {
        seed /= ov("elapsed_time");
    }

    seed = seed | rand();
    seed = (seed & tmp) | ((!seed) & rf);

    return seed;
}

char substr(char str, int start_index, int length) {
    if ( start_index+length > strlength(str) ) return NULL();
    if ( start_index < 0 || strlength(str) <= 0 ) return NULL();

    str = strright(str, start_index);
    str = strleft(str, length);

    return str;
}

char getchar(char str, int index) {

    if ( index >= strlength(str) ) index = strlength(str)-1;
    else if ( index < 0 ) index = 0;

    if ( strlength(str) > 0 ) {
        str = strright(str, index);

        if ( strlength(str) > 1 ) {
            index = 1;
            str = strleft(str, index);
        }
    }

    return str;
}

int searchstr_index(char txt, char pat, int reverse_flag) {
    char tmp = "";

        tmp = strinfirst(txt,pat);
        if ( tmp == -1 ) return -1;
        else return ( strlength(txt)-strlength(tmp) );

}

float to_float(char num) {
    char str_decimal = "", str_mantix = "", str_digit = "", tmp = "";
    int decimal = 0, sign = 1, sign_flag = 0;
    float digit = 0;
    int i = 0;
    float float_num = 0, mantix = 0;

    i = searchstr_index(num,".");
    if ( i != -1 ) {
        str_decimal = substr(num,0,i);
        str_mantix = substr(num,i+1,strlength(num)-i-1);
    } else {
        str_decimal = num;
        str_mantix = "";
    }

    tmp = getchar(str_decimal,0);
         if ( tmp == "+" ) { sign =  1; sign_flag = 1; }
    else if ( tmp == "-" ) { sign = -1; sign_flag = 1; }
    if ( sign_flag ) str_decimal = substr(str_decimal,1,strlength(str_decimal)-1);

    // get decimal part
    for ( i = strlength(str_decimal)-1; i >= 0; --i ) {
        str_digit = getchar(str_decimal,i);

             if ( str_digit == "0" ) digit = 0;
        else if ( str_digit == "1" ) digit = 1;
        else if ( str_digit == "2" ) digit = 2;
        else if ( str_digit == "3" ) digit = 3;
        else if ( str_digit == "4" ) digit = 4;
        else if ( str_digit == "5" ) digit = 5;
        else if ( str_digit == "6" ) digit = 6;
        else if ( str_digit == "7" ) digit = 7;
        else if ( str_digit == "8" ) digit = 8;
        else if ( str_digit == "9" ) digit = 9;
        else continue;

        digit *= exp(10,strlength(str_decimal)-1-i);
        decimal += digit;
    }

    // get mantix part
    for ( i = 0; i < strlength(str_mantix); ++i ) {
        int div = 0;

        str_digit = getchar(str_mantix,i);

             if ( str_digit == "0" ) digit = 0;
        else if ( str_digit == "1" ) digit = 1;
        else if ( str_digit == "2" ) digit = 2;
        else if ( str_digit == "3" ) digit = 3;
        else if ( str_digit == "4" ) digit = 4;
        else if ( str_digit == "5" ) digit = 5;
        else if ( str_digit == "6" ) digit = 6;
        else if ( str_digit == "7" ) digit = 7;
        else if ( str_digit == "8" ) digit = 8;
        else if ( str_digit == "9" ) digit = 9;
        else continue;

        div = exp(10,i+1);
        digit = (digit*1.0)/div; // *1.0 to normalize to float
        mantix += digit;
    }

    float_num = (sign*(decimal+mantix));

    return float_num;
}

int exp(int base, int exp) {
    int i = 0;
    int result;
    int sign = 1;

    if ( base < 0 ) sign = -1;
    base = abs(base);
    exp = abs(exp);
    result = base;

    if ( exp == 0 ) return 1;
    for ( i = 0; i < exp-1; ++i ) {
        result *= base;
    }
    result *= sign;

    return result;
}

float abs(float num) {
    if (num < 0) num *= -1;

    return num;
}

Post yours!!
 
White Dragon said:
What do you think about my random generator?
This is becouse rand() isnt a true random generator...

I wrote on this elsewhere - the internal random generator uses YOU as the seed by detecting inputs when AI entities are on screen and running a bitwise shift. It's a very clever and simple workaround since A) system clocks are not reliably available cross platform and B) it's effectively impossible for humans not have some level of randomness.

The obvious limitation is that it only works after you've been in regular gameplay mode with at least one AI controlled entity on screen.

I like your workaround WD. I had one based on a pregame menu that had invisible AI entities that couldn't harm or be harmed.

DC

 
Thank you guys! Unfortunately, the computational cost is not so low, and this function cannot be called every frame. But it's a beginning..

DC I followed your effort for rand() func!!
I always appreciate your intents to the engine!  ;)
 
White Dragon said:
Thank you guys! Unfortunately, the computational cost is not so low, and this function cannot be called every frame. But it's a beginning..

DC I followed your effort for rand() func!!
I always appreciate your intents to the engine!  ;)

Why not combine solutions then? Use yours for the pre game content and switch back to the internal generator one the action starts.

DC
 
Back
Top Bottom