Random numbers are an important concept in computer science and mathematics. They are widely used in various areas such as cryptography, game programming, simulations, and more. Random numbers are generated by programs through the use of a random number generator (RNG), which is a function that produces a sequence of numbers that are uniformly distributed and statistically independent.
One of the most common ways to generate random numbers is by using the standard rand() function in programming languages like C/C++. However, this function has some limitations such as the generation of predictable and nonuniform random numbers. In this article, we will discuss various alternative methods to generate random numbers without using the rand() function.
Method 1: Using time()
One of the simplest ways to generate a random number is by using the current time as the seed for the RNG. This method is easy to implement and gets a good level of randomness.
Code Example in C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(NULL)); // initialize RNG with current time
printf("Random number: %d", rand()); // generate random number
return 0;
}
Explanation:
In the above code, we use the srand() function to seed the random number generator with the current time (represented by NULL). After seeding, we can call the rand() function to generate the random number. Since the seed value is constantly changing, we can expect to generate a different random number each time we run the program.
Method 2: Using a Linear Congruential Generator (LCG)
A Linear Congruential Generator (LCG) is a simple RNG algorithm that generates a sequence of pseudorandom numbers using a linear equation. Although LCGs are deterministic, meaning that they can produce the same sequence of numbers if given the same seed, they are widely used due to their simplicity and efficiency.
Code Example in C:
#include <stdio.h>
#include <stdlib.h>
int main()
{
// initialize variables
long a = 1664525;
long c = 1013904223;
long m = RAND_MAX;
int seed = 123456; // arbitrary seed value
// generate 10 random numbers with LCG
for (int i = 0; i < 10; i++)
{
seed = (a * seed + c) % m;
printf("%d
", seed);
}
return 0;
}
Explanation:
In the above code, we define the values for the LCG linear equation, specifically the constants a, c, and m. We also initialize an arbitrary seed value and use it to generate 10 random numbers using the formula seed = (a * seed + c) % m. Note that we use the modulus operator % to ensure that the generated value is within the range of 0 to RAND_MAX, which is the maximum value that can be generated by the rand() function.
Method 3: Using Hashing Algorithms
Another way to generate random numbers is by using hashing algorithms such as SHA256. A hashing algorithm is a function that takes an input (also known as a message) and produces a fixedsize output (also known as a hash or digest). Hashing algorithms are often used in cryptography and digital signatures, but they can also be used for generating random numbers.
Code Example in Python:
import hashlib
def generate_random_number(seed):
m = hashlib.sha256(str(seed).encode()).hexdigest()
return int(m, 16) % 1000000 # generate a 6digit number
# generate 10 random numbers
for i in range(10):
print(generate_random_number(i))
Explanation:
In the above code, we define a function generate_random_number() that takes a seed value as input, hashes it using the SHA256 algorithm, and then converts the resulting hash to an integer value in the range of 0 to 1,000,000. We then call this function 10 times with different seed values to generate a sequence of random numbers. Since the SHA256 algorithm is deterministic, we can expect to produce the same sequence of random numbers if we use the same seed.
Conclusion:
In this article, we have discussed various alternative methods for generating random numbers without using the standard rand() function. These methods include using the current time as a seed, Linear Congruential Generators (LCGs), and hashing algorithms such as SHA256. While these methods may not be as efficient or statistically robust as the rand() function, they offer a good level of randomness and can be useful in certain applications.
let's delve deeper into the topics discussed in the article.
Using Time as Seed:
The method of using the current time as a seed for the RNG is based on the fact that the time value is constantly changing and we cannot predict its value accurately. Since the seed value is constantly changing, we can expect to generate a different random number each time we run the program. However, this method has some limitations. For instance, if we run the program multiple times within the same second, we might generate the same random number again. Furthermore, if someone knows the time when the program was run, they might be able to predict the random number generated by the program.
Using Linear Congruential Generator (LCG):
LCGs are a type of pseudorandom number generator that can efficiently generate a sequence of seemingly random numbers using a linear equation. LCGs are deterministic, meaning that if we provide the same seed value, they will always generate the same sequence of numbers. Therefore, it is important to use a good seed value to generate a reliable sequence of random numbers. The quality of the random numbers generated by an LCG depends on the choice of parameters (a, c, and m) used in the algorithm. It has also been observed that LCGs have some statistical weaknesses, such as having a strong bias towards certain values and patterns in the generated numbers.
Using Hashing Algorithms:
Hashing algorithms are popularly used in cryptography to ensure data integrity and authentication. These algorithms can also be used to generate random numbers by hashing a seed value. Hashing algorithms are nondeterministic, meaning that even a slight change in the input results in a completely different output. Therefore, by hashing different seed values, we can generate a sequence of seemingly random numbers. The quality of the random numbers generated by a hashing algorithm depends on the size of the output hash and the nature of the algorithm used.
In conclusion, while generating random numbers using these methods may not be as good as the rand() function, these methods offer a good level of randomness and can be useful in various situations. Programmers may need to choose the right method depending on their requirements, such as the quality of randomness and the speed of generation.
Popular questions

What is the rand() function used for in programming languages?
Answer: The rand() function is used to generate random numbers in programming languages, such as C/C++. 
What are the limitations of using the rand() function to generate random numbers?
Answer: The rand() function can generate predictable and nonuniform random numbers, depending on the seed value used to initialize the generator. 
What is a Linear Congruential Generator (LCG)?
Answer: An LCG is a simple RNG algorithm that generates a sequence of pseudorandom numbers using a linear equation. It is deterministic, meaning that it can produce the same sequence of numbers if given the same seed. 
What is the purpose of hashing algorithms in generating random numbers?
Answer: Hashing algorithms can be used to generate random numbers by hashing a seed value. A slight change in the input results in a completely different output, ensuring that the generated numbers are random and unpredictable. 
How can we generate random numbers without using the rand() function?
Answer: We can generate random numbers by using the current time as a seed, Linear Congruential Generators (LCGs), or hashing algorithms such as SHA256. These methods may not be as efficient or statistically robust as the rand() function, but they offer a good level of randomness and can be useful in certain applications.
Tag
Pseudorandom.