Random.Sample Method
[ This article is for Windows Phone 8 developers. If you’re developing for Windows 10, see the latest documentation. ]
Returns a random number between 0.0 and 1.0.
Assembly: mscorlib (in mscorlib.dll)
Return Value
Type: System.DoubleA double-precision floating point number greater than or equal to 0.0, and less than 1.0.
To produce a different random distribution or a different random number generator principle, derive a class from the Random class and override the Sample method.
Important Note: |
|---|
The Sample method is protected, which means that it is accessible only within the Random class and its derived classes. To generate a random number between 0 and 1 from a Random instance, call the NextDouble method. |
If you derive a class from Random and override the Sample method, the distribution provided by the derived class implementation of the Sample method is not used in calls to the base class implementation of the following methods:
The Random.NextBytes(Byte()) method.
The Random.Next method.
The Random.Next(Int32, Int32) method, if (maxValue - minValue) is greater than Int32.MaxValue.
Instead, the uniform distribution provided by the base Random class is used. This behavior improves the overall performance of the Random class. To modify this behavior to call the implementation of the Sample method in the derived class, you must also override the behavior of these three members. The example provides an illustration.
The following code example derives a class from Random and overrides the Sample method to generate a distribution of random numbers. This distribution is different than the uniform distribution generated by the Sample method of the base class.
' This derived class converts the uniformly distributed random ' numbers generated by base.Sample( ) to another distribution. Public Class RandomProportional Inherits Random ' The Sample method generates a distribution proportional to the value ' of the random numbers, in the range [0.0, 1.0]. Protected Overrides Function Sample() As Double Return Math.Sqrt(MyBase.Sample()) End Function Public Overrides Function [Next]() As Integer Return Sample() * Integer.MaxValue End Function End Class Module Example Public Sub Demo(ByVal outputBlock As System.Windows.Controls.TextBlock) Const rows As Integer = 4, cols As Integer = 6 Const runCount As Integer = 1000000 Const distGroupCount As Integer = 10 Const intGroupSize As Double = _ (CDbl(Integer.MaxValue) + 1.0) / _ CDbl(distGroupCount) Dim randObj As New RandomProportional() Dim intCounts(distGroupCount) As Integer Dim realCounts(distGroupCount) As Integer Dim i As Integer, j As Integer outputBlock.Text &= vbCrLf & _ "The derived RandomProportional class overrides " & _ "the Sample method to " & vbCrLf & _ "generate random numbers in the range " & _ "[0.0, 1.0]. The distribution " & vbCrLf & _ "of the numbers is proportional to their numeric " & _ "values. For example, " & vbCrLf & _ "numbers are generated in the vicinity of 0.75 " & _ "with three times " & vbCrLf & "the " & _ "probability of those generated near 0.25." & vbCrLf outputBlock.Text &= vbCrLf & _ "Random doubles generated with the NextDouble( ) " & _ "method:" & vbCrLf & vbCrLf ' Generate and display [rows * cols] random doubles. For i = 0 To rows - 1 For j = 0 To cols - 1 outputBlock.Text &= String.Format("{0,12:F8}", randObj.NextDouble()) Next j outputBlock.Text &= vbCrLf Next i outputBlock.Text &= vbCrLf & _ "Random integers generated with the Next( ) " & _ "method:" & vbCrLf & vbCrLf ' Generate and display [rows * cols] random integers. For i = 0 To rows - 1 For j = 0 To cols - 1 outputBlock.Text &= String.Format("{0,12}", randObj.Next()) Next j outputBlock.Text &= vbCrLf Next i outputBlock.Text &= String.Format(vbCrLf & _ "To demonstrate the proportional distribution, " & _ "{0:N0} random " & vbCrLf & _ "integers and doubles are grouped into {1} " & _ "equal value ranges. This " & vbCrLf & _ "is the count of values in each range:" & vbCrLf, _ runCount, distGroupCount) & vbCrLf outputBlock.Text &= String.Format("{0,21}{1,10}{2,20}{3,10}", _ "Integer Range", "Count", "Double Range", "Count") & vbCrLf outputBlock.Text &= String.Format("{0,21}{1,10}{2,20}{3,10}", _ "-------------", "-----", "------------", "-----") & vbCrLf ' Generate random integers and doubles, and then count ' them by group. For i = 0 To runCount - 1 intCounts(Fix(CDbl(randObj.Next()) / _ intGroupSize)) += 1 realCounts(Fix(randObj.NextDouble() * _ CDbl(distGroupCount))) += 1 Next i ' Display the count of each group. For i = 0 To distGroupCount - 1 outputBlock.Text &= String.Format( _ "{0,10}-{1,10}{2,10:N0}{3,12:N5}-{4,7:N5}{5,10:N0}", _ Fix(CDbl(i) * intGroupSize), _ Fix(CDbl(i + 1) * intGroupSize - 1.0), _ intCounts(i), _ CDbl(i) / CDbl(distGroupCount), _ CDbl(i + 1) / CDbl(distGroupCount), _ realCounts(i)) & vbCrLf Next i End Sub End Module ' This example of Random.Sample() generates the following output: ' The derived RandomProportional class overrides the Sample method to ' generate random numbers in the range [0.0, 1.0]. The distribution ' of the numbers is proportional to their numeric values. For example, ' numbers are generated in the vicinity of 0.75 with three times ' the probability of those generated near 0.25. ' ' Random doubles generated with the NextDouble( ) method: ' ' 0.28377004 0.75920598 0.33430371 0.66720626 0.97080243 0.27353772 ' 0.17787962 0.54618410 0.08145080 0.56286100 0.99002910 0.64898614 ' 0.27673277 0.99455281 0.93778966 0.76162002 0.70533771 0.44375798 ' 0.55939883 0.87383136 0.66465779 0.77392566 0.42393411 0.82409159 ' ' Random integers generated with the Next( ) method: ' ' 1364479914 1230312341 1657373812 1526222928 988564704 700078020 ' 1801013705 1541517421 1146312560 338318389 1558995993 2027260859 ' 884520932 1320070465 570200106 1027684711 943035246 2088689333 ' 630809089 1705728475 2140787648 2097858166 1863010875 1386804198 ' ' To demonstrate the proportional distribution, 1,000,000 random ' integers and doubles are grouped into 10 equal value ranges. This ' is the count of values in each range: ' ' Integer Range Count Double Range Count ' ------------- ----- ------------ ----- ' 0- 214748363 9,892 0.00000-0.10000 9,928 ' 214748364- 429496728 30,341 0.10000-0.20000 30,101 ' 429496729- 644245093 49,958 0.20000-0.30000 49,964 ' 644245094- 858993458 70,099 0.30000-0.40000 70,213 ' 858993459-1073741823 90,801 0.40000-0.50000 89,553 ' 1073741824-1288490187 109,699 0.50000-0.60000 109,427 ' 1288490188-1503238552 129,438 0.60000-0.70000 130,339 ' 1503238553-1717986917 149,886 0.70000-0.80000 150,000 ' 1717986918-1932735282 170,338 0.80000-0.90000 170,128 ' 1932735283-2147483647 189,548 0.90000-1.00000 190,347
Important Note: