Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate random values in C#

How can I generate random Int64 and UInt64 values using the Random class in C#?

like image 803
SyncMaster Avatar asked Mar 24 '09 13:03

SyncMaster


People also ask

What does RAND () do in C?

rand() The function rand() is used to generate the pseudo random number. It returns an integer value and its range is from 0 to rand_max i.e 32767.

Does C have a random number generator?

In the C programming language, we have a function called rand, which helps in generating the random number. This function comes predefined in C and can be implemented in the program using stdlib. h header file.


Video Answer


2 Answers

This should do the trick. (It's an extension method so that you can call it just as you call the normal Next or NextDouble methods on a Random object).

public static Int64 NextInt64(this Random rnd) {     var buffer = new byte[sizeof(Int64)];     rnd.NextBytes(buffer);     return BitConverter.ToInt64(buffer, 0); } 

Just replace Int64 with UInt64 everywhere if you want unsigned integers instead and all should work fine.

Note: Since no context was provided regarding security or the desired randomness of the generated numbers (in fact the OP specifically mentioned the Random class), my example simply deals with the Random class, which is the preferred solution when randomness (often quantified as information entropy) is not an issue. As a matter of interest, see the other answers that mention RNGCryptoServiceProvider (the RNG provided in the System.Security namespace), which can be used almost identically.

like image 186
Noldorin Avatar answered Sep 18 '22 21:09

Noldorin


Use Random.NextBytes() and BitConverter.ToInt64 / BitConverter.ToUInt64.

// Assume rng refers to an instance of System.Random byte[] bytes = new byte[8]; rng.NextBytes(bytes); long int64 = BitConverter.ToInt64(bytes, 0); ulong uint64 = BitConverter.ToUInt64(bytes, 0); 

Note that using Random.Next() twice, shifting one value and then ORing/adding doesn't work. Random.Next() only produces non-negative integers, i.e. it generates 31 bits, not 32, so the result of two calls only produces 62 random bits instead of the 64 bits required to cover the complete range of Int64/UInt64. (Guffa's answer shows how to do it with three calls to Random.Next() though.)

like image 24
Jon Skeet Avatar answered Sep 20 '22 21:09

Jon Skeet