How do i deterministically generate n unique numbers within a range from a GUID?

syco_link

A concrete example.

If i have a range of 1-300, how can a generate 5 unique numbers within that range using GUID "EDAAE218-FBF0-4B66-AEAF-FB036FBF69F4". Applying the same algorithm to the GUID should result in the same 5 numbers being chosen every time.

The input doesn't have to be a GUID, it's just acting as some sort of key.

Some context for the problem i am trying to solve. I have a hard coded List of values that contains roughly 300 or so elements. I am trying to find a way to select 20 elements from this list that always produces the same elements.

My idea was to generate a GUID which could be handed out to multiple users. When those users input the GUID into the app, the same 20 elements would be returned for everyone.

Adam Brown

A guid is effectively a 128-bit number. So you can easily do this provided that the number of bits required to represent your numbers are fewer than the number of bits in the guid (128). You don't need to hash the guid or anything like that.

EDIT:

Now that I know what you need (i.e. a unique seed to be derived from a guid, you could do it this way) - but you could equally hand out a 32-bit number and avoid the guid-to-int conversion.

EDIT2: Using GetHashCode as per suggestion from comments above.

EDIT 3: Producing unique numbers.

 static void Main(string[] args)
 {
     var guid = new Guid("bdc39e63-5947-4704-9e12-ec66c8773742");
     Console.WriteLine(guid);
     var numbers = FindNumbersFromGuid(guid, 16, 8);

     Console.WriteLine("Numbers: ");
     foreach (var elem in numbers)
     {
         Console.WriteLine(elem);
     }
     Console.ReadKey();
 }

 private static int[] FindNumbersFromGuid(Guid input,
     int maxNumber, int numberCount)
 {
     if (numberCount > maxNumber / 2) throw new ArgumentException("Choosing too many numbers.");
     var seed = input.GetHashCode();
     var random = new Random(seed);
     var chosenSoFar = new HashSet<int>();
     return Enumerable.Range(0, numberCount)
         .Select(e =>
         {
             var ret = random.Next(0, maxNumber);
             while (chosenSoFar.Contains(ret))
             {
                 ret = random.Next(0, maxNumber);
             }
             chosenSoFar.Add(ret);
             return ret;
         }).ToArray();
 }

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Generate 'n' unique random numbers within a range

How do I generate a random range of numbers within another range?

How do i generate 2 random numbers, once within the range of 50 and 259, and once within 50 and 159?

How do I generate random numbers but not repeating and within a certain range based on user input?

How do I deterministically convert Pandas string columns into specific numbers?

Generate 'n' unique random number within a range

How to get this PRNG to generate numbers within the range?

how to generate unique random numbers with a specific range

How to generate a unique range of numbers in PHP

How do I generate numbers that vary from a range depending on the user input

Generate Array of Unique Random Numbers within Inclusive Range

How do I generate random but unique numbers in python?

How do I generate a vector of random numbers in a range?

How to get n unique numbers uniformly from a given range?

generate range of numbers from 1 to N in Netezza

Generate N unique random integers within a specified range

How to generate n random numbers within a range matching a fixed sum in javascript?

I want to generate random numbers within given range in java

Python: Fastest way to generate unique lists from a range of numbers

How do I calculate an average of a range from a series within in a dataframe?

How to generate random numbers in range from INPUT?

How do I generate an array containing the numbers 1 to n in Postgres

Pyspark - how to generate random numbers within a certain range of a column value?

How to generate random Double numbers in Google Sheets within range?

How to generate a population of random numbers within a certain exponentially increasing range

How do I extract text and numbers from a string within a cell?

How to generate unique numbers in range 0001 - 2000 with rand() in C

How do I generate all possible numbers from this regular expression?

How do I use the "IF statement" to select numbers from a range?