lundi 24 septembre 2018

C - Middle Square Random Number Generator

So, I tried to implement the Middle Square PRNG method, to generate the first 100 numbers. It works well until a certain point, when I get as a result negative numbers. I used the time library to change the values on my temp array, so that it won't get stuck on the same sequence, where the number ends with two zeros.

My code :

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

time_t now;
struct tm *tm;

unsigned long int prng(int seed)
{
    int num = seed * seed;
    int t[10], inc = 0;
    //Reverse number in an array
    while(num != 0)
    {
        t[inc] = num%10;
        num /= 10;
        inc++;
    }
    int min = inc/4;
    int max = inc / 2 + min;
    int temp[10];

    //Assign the middle square part to another table
    for(int i = min; i <= max; i++)
    {
        temp[i-min] = t[i];
    }

    for(int i=0; i < max-min; i++)
    {
        //Check if there is a "0" "0" sequence, if TRUE - replace with current time (seconds)
        if(temp[i] == 0 && temp[i+1] == 0)
        {
            now = time(0);
            tm = localtime(&now);
            temp[i] = tm->tm_sec/10;
            temp[i + 1] = tm->tm_sec%10;
        }
    }

    //Transform the squared array into an integer
    unsigned long int k = 0;
    for (int i = 0; i <= max-min; i++)
        k = 10 * k + temp[i];


    return k;
}

int main()
{
    unsigned long int n = 123; //seed
    printf("%d ", n);
    for(int i = 0; i<100; i++)
    {
        n = prng(n);
        printf("\n%d ", n);
    }
    return 0;
}

The results that I get:

123
215
226
701
419
6557
24992
7064
7099
85930
-696950
8997
6490
10212
94824
36561
760763
-724206
30238
66334
22325
65048
-94273
...




Aucun commentaire:

Enregistrer un commentaire