Generate a big digit with only 1 2 3 and 4,How to generate a big number that only countains 0 to 3

I’m creating a Genetics system to my game based in Space Station 13, but genetics in the game have like 100 variables per player so i was working on a optimized version that could put everything in just a few, my idea is to make number composed only of 1s to 4s, like: 1423(the numbers are gonna be 16digits but i’m using small ones here so it’s easier to understand), the reason it’s numbers from 1 to 4 is because:

  • **1 means Cromossome TA **
  • **2 means Cromossome AT **
  • **3 means Cromossome CG **
  • 4 means Cromossome GC

The variables are gonna be translated to a string when being read by the user but i want to keep them as this numbers since it’s way faster and simpler to have a 16 digit number(Ulong) compared to having 16 different arrays for every single disease, the problem is that if I use the random functions like Mathf.Random it generates just a random number, which could be like 5948 and I can’t have any number other than 1 2 3 and 4, So basically:
I want to have a function that can generate big numbers composed only of number between 1 and 4, for example: 1423142324132232, it’s a big number because it’s a Ulong type
In the end they are going to be translated back to string to be understand by the player, like 1432 = TAGCCGAT, also if possible a way to get only a certain digit of a number

,I’m trying to make a “Genetics” system for a game of mine, every DNA would have a 16-digit number(a Ulong variable), the problem is that I can only have numbers from 1 to 4, because in my system:

  • 1 = TA cromossome
  • 2 = AT cromossome
  • 3 = CG cromossome
  • 4 = GC cromossome

So if i simply use Mathf.Random it could generate something like 19382… and I can’t have number like 9 or 8 in the variables, in this case i want something like: 1243432313212312, as you can see, a 16-digit number which contains only number from 1 to 4, not related to the question but if possible also a way to read and change a specific digit, like see only the fifth digit in the number to translate it to a string, instead of reading the entire number

Hello there,

This may not be the best way to do this, but it works:

    public static int GenerateRandXDigitCode(int nbOfDigits, int min, int max)
    {
        string toReturn = "";
        for (int i = 0; i < nbOfDigits; ++i)
        {
            int rand = UnityEngine.Random.Range(min, max);
            toReturn += rand.ToString();
        }

        return int.Parse(toReturn);
    }

nbOfDigits is the length of your number, min is the inclusive minimum (1 in your case), and max is the exclusive maximum (5 in your case).


Hope that helps!

Cheers,

~LegendBacon

This function will generate the number

    //Generate a number numDigits long where each digit is a random number between 0 and 4 inclusive 
    ulong GenerateNumber(int numDigits)
    {
        ulong retval = 0;
        for (int i = 0; i < numDigits; i++)
        {
            ulong digit = (ulong)Random.Range(0, 5); //This will return an int between 0-4 inclusive

            //This loop is the equivalent of doing: digit * (10 ^ i)
            for(int j = 0; j < i; j++) //Add i number of trailing zeros
            {
                digit *= 10;
            }
            retval += digit;//Add to the existing number
        }
        return retval;
    }

And this function can be used to determine the digit at particular place in a larger number

     //Get the digit occupying a particular place in a number 
    //Note: This is zero indexed and right to left
    //i.e. place 0 is the ones column, place 1 is the tens column, etc.  
    int GetDigit(ulong fullNumber, int place)
    {
        ulong retval = fullNumber;
        //Loop through removing all digits to the right of the one we want
        for(int i = 0; i < place; i++)
        {
            retval /= 10;
        }
        //Remove all digits to the left of the one we want
        retval %= 10; 
        return (int)retval;
    }