C#

Generate Random Double Numbers in a Range in C#

In this article, we are going to learn how to generate random double numbers in a range in C#.

To download the source code for this article, you can visit our GitHub repository.

Generate a Pseudorandom Double

To generate a pseudorandom double number we can use the NextDouble method from the Random class:

var random = new Random();
var rDouble = random.NextDouble();

This will return a double that is at least 0.0 and less than 1.0.

Generate a Secure Random Double

The RandomNumberGenerator class does not have a built-in method to generate a secure random double. In order to get a double between 0.0 and 1.0, we need to first create a secure random generated integer with the GetInt32 method:

RandomNumberGenerator.Create(); 
var denominator = RandomNumberGenerator.GetInt32(2, int.MaxValue);

The lower bound passed to GetInt32 must be greater than 0 to avoid the chance of the method returning a 0 causing a divide by zero error later when we are converting from integer to double. Additionally, if we wish the double to not have the possibility of equaling 1, then the lower bound passed to GetInt32 must be 2 or greater.

Then we can divide 1 by the secure random integer we just created and cast the result to a double to generate a secure random double:

public static double GetSecureDouble()
{
    RandomNumberGenerator.Create();
    var denominator = RandomNumberGenerator.GetInt32(2, int.MaxValue);
    double sDouble = (double) 1 / denominator;
    return sDouble;
}

The double’s length and value will be determined by the upper and lower bound criteria given to the RandomNumberGenerator.GetInt32 method.

Generate a Pseudorandom Double Within a Specified Range

The Random class provides a simple way to generate a double between 0 and 1. However, we want to get a number larger than 1 or less than zero within a custom range. Let’s accomplish this with our own custom method:

public static double GetPseudoDoubleWithinRange(double lowerBound, double upperBound)
{
    var random = new Random();
    var rDouble = random.NextDouble();
    var rRangeDouble = rDouble * (upperBound - lowerBound) + lowerBound;
    return rRangeDouble;
}

We begin our custom method by generating a double with the NextDouble method. Notice that next we use a specific formula that modifies the double into the specified range. Multiplying the double value by the difference between the lowerBound and upperbound ensures that the double is below the upper bound.  Then we add the lowerBound which keeps the double above the lower bound.

Generate a Secure Random Double Within a Specified Range

We can create a secure double using the same formula and utilizing our custom GetSecureDouble method:

public static double GetSecureDoubleWithinRange(double lowerBound, double upperBound)
{
    var rDouble = GetSecureDouble();
    var rRangeDouble = (double) rDouble * (upperBound - lowerBound) + lowerBound;
    return rRangeDouble;
}

Now, if we want to use our custom methods, we can call them in the same way we would as the methods within the Random class:

var pseduoDoubleWithinRange = GetPseudoDoubleWithinRange(16, 30000);
var secureDoubleWithinRange = GetSecureDoubleWithinRange(4, 123000);

That’s it, let’s summarize what we’ve learned.

Conclusion

The two main ways to generate random double numbers in a range in C# is using the Random and RandomNumberGenerator classes.  At first glance, it could appear slightly overwhelming when attempting to generate a double within a range.  However, we hope that the above explanations clearly show how you can create your own methods to obtain your required random results.

If you want to achieve the same thing with integers, you can visit our article on how to generate random integers in C#.

Code Maze

View Comments

  • Use this one if you need a uniform distribution:

            public static double GetSecureDouble()
            {
                RandomNumberGenerator.Create();
                var numerator = RandomNumberGenerator.GetInt32(0, int.MaxValue);
                double sDouble = (double)numerator / int.MaxValue;
                return sDouble;
            }
    
Share
Published by
Code Maze

Recent Posts

HttpClient vs RestSharp – Which One to Use in .NET

HttpClient and RestSharp are HTTP Client libraries that we can use to consume APIs. Working…

Updated Date Jul 7, 2022

Testing Repository Pattern Using Entity Framework

Unit Testing is extremely important for creating robust software. It's very simple in principle but…

Updated Date Jul 6, 2022

Shell Sort in C#

Have you ever needed to sort a list of items, but didn't want to use…

Updated Date Jul 5, 2022

How to Resolve Instances With ASP.NET Core DI

In ASP.NET Core dependency injection, we usually register injectable dependencies at the start of our…

Jul 4, 2022

Ranges and Indices in C#

In this article, we are going to learn more about ranges and indices in C#,…

Updated Date Jul 2, 2022

Code Maze Weekly #128

Issue #128 of the Code Maze weekly. Check out what's new this week and enjoy…

Updated Date Jul 1, 2022