Sample Method
Collapse the table of content
Expand the table of content

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.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

'Declaration
Protected Overridable Function Sample As Double

Return Value

Type: System.Double
A 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 noteImportant 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.

Notes to Inheritors

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:

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


Windows Phone OS

Supported in: 8.1, 8.0, 7.1, 7.0

Windows Phone

Show:
© 2017 Microsoft