# Random Ranged Number Generator

By , 1 Jun 2011

## Important Point

In my algorithm I actually used the system time (Seconds and Milliseconds) with the factorial function to generate the random numbers unlike other articles who haven’t mentioned the time technique in its generating process.

## Introduction

Random number generators are used for encryption, gambling, and other applications however, a random number is a number generated by a process, where the output is unpredictable.

In fact there are two ways of generating numbers physical and software generators, where the software generated numbers are called pseudo random numbers. In my project, I used VB.NET to generate random numbers. The objective of the project is to:

• Have an efficient program, by eliminating the repetitiveness of generated numbers as much as possible.
• Ensure that the generated numbers are distributed over a defined set, which is from (1-1000).

## Algorithm

The algorithm I implemented to generate random numbers provides a set of random numbers distributed among the range of (1-1000).

When the user runs the program, he/she can enter the numbers he/she wants to generate from (1-20) simply by clicking on the Generate button, where the minimum is 1 and the maximum is 20.

For example, if the user wants to generate 100 random numbers, he/she will enter five times the number 20 consequently, and the output will contain 20 random numbers each time it is generated and is saved in a text file “C://File.txt”.

By entering more than 20 numbers as an input, a message box will prompt the user: “Please enter a number less than or equal to 20”.

The idea of generating random numbers, is when the user clicks on the Generate button, the algorithm will generate the first number by taking the minutes of the current time, adding it to the seconds, adding it to the milliseconds, then adding it to the factorial of the counter for the first number, which is 1. Then it will take the value of the result mod (1000), and after that, adds 1 to the final result.

```Dim strdate As New String("")
strdate = (((DateTime.Now.Minute) + (DateTime.Now.Second) + _
(DateTime.Now.Millisecond) + Factorial(counter)) Mod (1000)) + (1)```

While it's generating numbers, the idea of adding the factorial is as the follows: for example, the user wants to generate 20 random numbers. The first number is generated as we mentioned previously by taking the minutes of the current time, adding it to the seconds, adding the milliseconds, and adding the factorial of 1, then when generating the second number, after adding minutes, seconds, and milliseconds, and the factorial of 2, then for the third number, the factorial of 3 will be added and so on, until the 20 numbers are generated.

The idea of taking the total result (minutes added to seconds added to milliseconds, then added to the factorial of the counter) mod (1000) is to insure that the output of generating random numbers will not contain any number larger than 1000, so all the results will be in the range of (1-1000).

According to the algorithm, for more efficient results, number 1 will be added to the total result for each generated number. If the total result equals to zero, adding number 1 to the total result will ensure that the generated number will be in the range of (1-1000). If the total result equals to 999, adding number 1 will ensure that the set of generated random numbers will contain number 1000 according to the specified range.

After the calculation is performed, the result (strdate) will be converted into int64 saved in a text file “C://File.txt”.

When the generator finishes generating the first number, the generator will stop and sleep for 2 milliseconds before it starts generating the following random number, and so on for all numbers. This is used for eliminating the chance of repetitiveness in generating a large set of random numbers.

```If txtHowMany.Text > 20 Then
MsgBox("Please Enter a number less than or equal to 20", MsgBoxStyle.Critical)
Else
Dim counter As Integer = 1
For counter = 1 To txtHowMany.Text
Dim strdate As New String("")
strdate = (((DateTime.Now.Minute) + (DateTime.Now.Second) + _
(DateTime.Now.Millisecond) +Factorial(counter)) Mod (1000)) + (1)
strdate = strdate.Replace("/", "")
Dim x As Int64
x = Convert.ToInt64(strdate)
Dim objWriter As New StreamWriter("C://File.txt", True)
objWriter.WriteLine(x)
objWriter.Close()```

## Testing

When I tested the logic, the results where:

• When I generated 50 random numbers, there were no duplicated values.
```985, 190,397, 618, 917, 719, 243, 726, 489, 612, 814, 818,
221, 824, 827, 29, 233, 436, 639, 842, 46, 250, 457, 678, 977,
780, 303, 786, 549, 672, 875, 878, 281, 884, 887, 90, 293, 496,
699, 902, 133, 337, 544, 765, 64, 867, 390, 873, 636,759.```
• When I generated 60 random numbers, there was one duplicate value.
```844, 48, 254, 473, 770, 571, 93, 578, 341, 465, 666, 668, 70,
671, 672, 875, 79, 280, 481, 682, 619, 821, 26, 246, 543, 344, 869, 352, 116,
238, 352,116,238, 439, 441, 842,444,447, 650,853,54, 256, 457, 623, 825, 30,
250,548, 356, 879, 360, 122, 243, 444, 445,850,454, 455, 656, 857, 58, 260,461.```
• When I generated 100 random numbers, there were two duplicate values.
```598, 802, 7, 227, 528, 331, 853, 335, 97, 218, 420, 421,
825, 429,430, 631, 832, 33, 235, 440, 66, 268, 473, 699, 998,
800, 322, 803, 564, 685, 890, 893, 296, 898, 899, 101, 302, 503,
707, 910, 804, 7, 213, 432, 729, 538, 61, 544, 306, 427, 628, 629,
31, 636, 639,842, 43, 245, 446, 647, 229, 439, 646, 867, 164, 966, 552,
34, 795, 917, 120, 121, 523, 124,126, 327, 532, 734, 937, 140, 820, 22,
234, 455, 752,553, 74,556, 318, 443, 646, 649, 51, 652, 653, 854, 55, 261, 464, 667.```
• When I generated 600 random numbers, there were 139 duplicate values.

Here is a sample set of 30 numbers from the generated result: 797, 1000, 208, 429, 728, 531, 53, 537, 300, 423, 626, 628, 32, 635, 638, 841, 300, 43, 247, 450, 653, 531, 467, 674, 895, 194,997, 520, 626, 3.

• When I generated 1000 random numbers, there were 350 duplicate values.

A sample set of 30 numbers from the generated result: 97, 301, 600, 508, 729, 27, 831, 354, 837,600, 12, 926, 929, 332, 935, 141, 344, 547, 12, 651, 444, 88, 980, 515, 444, 240, 885, 666, 980, 331.

## Data Analysis

After testing the different data sets, I have concluded the following:

• After several repetitions for the first generated set which is in the range of (1-50), the percentage of repeated numbers was zero; this indicates that there is no number duplication.
• For the next generated set which is (1-60), the percentage of repeated numbers was 1.6%; this means that generating till 50 numbers, the result will not contain any duplicate value.
• For the generated set which is (1-100), the percentage of repeated numbers was 2%; this indicates that when generating 100 random numbers, there were two duplicate values. From my point of view, as a result, a 2% of repeated numbers among 100 numbers is efficient.
• For the generated set which is (1-600), the percentage of repeated numbers was 23.1%; this indicates that when generating 600 random numbers, there were 139 duplicated values.
• For the generated set which is (1-1000), the percentage of repeated numbers was 35%, this indicates that when generating 1000 random numbers, there were 350 duplicated values.
• From my point of view, as a result, a 35% of repeated numbers among 1000 numbers is efficient, and still it’s less than the threshold 50%.
• The results that were conducted are normally distributed among the range of (1-1000); they are not concentrated in a certain range.

 Haitham Alany Software Developer Optimiza Iraq Member
No Biography provided

Votes of 3 or less require a comment

 Search this forum Profile popups    Spacing RelaxedCompactTight   Noise Very HighHighMediumLowVery Low   Layout Open AllThread ViewNo JavascriptPreview   Per page 102550
 View All Threads First Prev Next
 My vote of 2 Phillip465 2 Jun '11 - 6:38
 The fact the result will not contain any duplicate value till n = 50 is wrong, since it's random. The probability for a duplicate can be very small, but there will always be a chance that there is be a duplicate. Sign In·Permalink
 Last Visit: 31 Dec '99 - 18:00     Last Update: 25 May '13 - 16:16 Refresh 1