- Home /

# 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

**Answer** by Legend_Bacon
·
May 13, 2019 at 04:47 PM

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

Oh and in your case, you probably want to use longs instead of ints :)

Couple of notes about this solution

UnityEngine.Random.Range(int min, int max) is exclusive when it comes to the max value, the largest value it will return is (max - 1) Edit:Whoops just noticed you mentioned this!

Due to the immutable nature of strings this will create quite a bit of garbage which might be an issue depending on where/how often this function is used. This could be mitigated by using the StringBuilder class.

**Answer** by cdnDave
·
May 13, 2019 at 07:54 PM

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;
}
```

Instead of the inner `for`

loop, adding the digit to the left, why don't you multiply `retval`

by 10, and then, add `digit`

, "concatenating" it to the right of the number?

### Your answer

### Welcome to Unity Answers

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.

### Follow this Question

### Related Questions

Display random element from dictionary 0 Answers

Semi-Random Or Engine 1 Answer

My Script Wont work? 2 Answers

Is Random.Range() Really Maximally Inclusive? 4 Answers

How to make Random.Range() step by a certain amount? 1 Answer