0

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
...
Adrian Covaci
  • 67
  • 2
  • 12
  • Possible duplicate of [How to printf "unsigned long" in C?](https://stackoverflow.com/questions/3209909/how-to-printf-unsigned-long-in-c) – mattm Sep 24 '18 at 19:57
  • What problem are you asking us to fix? – Jay Sep 24 '18 at 20:00
  • I thought it's not possible to get negative numbers. EDIT: Also.. is it possible to make the results I get to fit in integer data types? – Adrian Covaci Sep 24 '18 at 20:29
  • 1
    If you don't want negative numbers, then use `unsigned int` instead of `int`. If you don't want `long`, then don't use it. – Ralf Stubner Sep 25 '18 at 10:03

0 Answers0