Freigeben über


Random.Sample-Methode

Gibt eine Zufallszahl zwischen 0,0 und 1,0 zurück.

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

Syntax

'Declaration
Protected Overridable Function Sample As Double
'Usage
Dim returnValue As Double

returnValue = Me.Sample
protected virtual double Sample ()
protected:
virtual double Sample ()
protected double Sample ()
protected function Sample () : double

Rückgabewert

Eine Gleitkommazahl mit doppelter Genauigkeit, die größer oder gleich 0,0 und kleiner als 1,0 ist.

Hinweise

Erstellen Sie eine von Random abgeleitete Klasse, um diese Methode zu überschreiben und eine andere Verteilung zu erzeugen.

Beispiel

Im folgenden Codebeispiel wird eine Klasse von Random abgeleitet und die Sample-Methode überschrieben, um eine Verteilung von Zufallszahlen zu erzeugen. Diese Verteilung unterscheidet sich von der einheitlichen Verteilung, die mit der Sample-Methode der Basisklasse erzeugt wurde.

' Example of the Random.Sample( ) method.
Imports System
Imports Microsoft.VisualBasic

Module  RandomSampleDemo

    ' This derived class converts the uniformly distributed random 
    ' numbers generated by base.Sample( ) to another distribution.
    Public Class RandomProportional
        Inherits Random

        ' Sample 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 
    End Class 

    Sub Main( )
        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 
            
        Console.WriteLine( "This example of Random.Sample( ) " & _
            "generates the following output." )
        Console.WriteLine( 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 the number " & _
            "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." )
        Console.WriteLine( vbCrLf & _
            "Random doubles generated with the NextDouble( ) " & _ 
            "method:" & vbCrLf )
            
        ' Generate and display [rows * cols] random doubles.
        For i = 0 To rows - 1
            For j = 0 To cols - 1
                Console.Write( "{0,12:F8}", randObj.NextDouble( ) )
            Next j
            Console.WriteLine( )
        Next i
            
        Console.WriteLine( vbCrLf & _
            "Random integers generated with the Next( ) " & _ 
            "method:" & vbCrLf )
            
        ' Generate and display [rows * cols] random integers.
        For i = 0 To rows - 1
            For j = 0 To cols - 1
                Console.Write( "{0,12}", randObj.Next( ) )
            Next j
            Console.WriteLine( )
        Next i
            
        Console.WriteLine( 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 )
        Console.WriteLine( "{0,21}{1,10}{2,20}{3,10}", _
            "Integer Range", "Count", "Double Range", "Count" )
        Console.WriteLine( "{0,21}{1,10}{2,20}{3,10}", _
            "-------------", "-----", "------------", "-----" )
            
        ' 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
            Console.WriteLine( _
                "{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 ) )
        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 the number 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.79518674  0.68830640  0.19325108  0.87495776  0.94214344  0.43960633
'   0.80547067  0.18420252  0.67677629  0.20395900  0.14804654  0.76552601
'   0.32595198  0.99375793  0.92964386  0.49341930  0.93379207  0.97324697
'   0.26255379  0.87768855  0.99630002  0.60385777  0.94307202  0.60923691
' 
' Random integers generated with the Next( ) method:
' 
'   1903578996  1413274413  1420485191  1091348055  1706557467  2039662942
'   1192987687  1795987411  1719118883  1433622886   856129071   840337946
'   1829524044  1709600961  1795736148  1667275347   935419628  1077895508
'    669189095   251371582  1826628229  1848954211  1218382751  1938456460
' 
' 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,852     0.00000-0.10000    10,113
'  214748364- 429496728    29,921     0.10000-0.20000    30,213
'  429496729- 644245093    50,243     0.20000-0.30000    49,963
'  644245094- 858993458    69,747     0.30000-0.40000    70,304
'  858993459-1073741823    90,743     0.40000-0.50000    90,075
' 1073741824-1288490187   110,004     0.50000-0.60000   109,749
' 1288490188-1503238552   129,605     0.60000-0.70000   129,941
' 1503238553-1717986917   150,184     0.70000-0.80000   149,703
' 1717986918-1932735282   169,624     0.80000-0.90000   169,923
' 1932735283-2147483647   190,077     0.90000-1.00000   190,016
// Example of the Random.Sample( ) method.
using System;

// This derived class converts the uniformly distributed random 
// numbers generated by base.Sample( ) to another distribution.
public class RandomProportional : Random
{
    // Sample generates a distribution proportional to the value 
    // of the random numbers, in the range [ 0.0, 1.0 ).
    protected override double Sample( )
    {
        return Math.Sqrt( base.Sample( ) );
    }
}

public class RandomSampleDemo  
{
    static void Main( )
    {   
        const int rows = 4, cols = 6;
        const int runCount = 1000000;
        const int distGroupCount = 10;
        const double intGroupSize = 
            ( (double)int.MaxValue + 1.0 ) / (double)distGroupCount;

        RandomProportional randObj = new RandomProportional( );

        int[ ]      intCounts = new int[ distGroupCount ];
        int[ ]      realCounts = new int[ distGroupCount ];

        Console.WriteLine( 
            "This example of Random.Sample( ) " +
            "generates the following output." );
        Console.WriteLine( 
            "\nThe derived RandomProportional class overrides " +
            "the Sample method to \ngenerate random numbers " +
            "in the range [0.0, 1.0). The distribution \nof " +
            "the numbers is proportional to the number values. " +
            "For example, \nnumbers are generated in the " +
            "vicinity of 0.75 with three times the \n" +
            "probability of those generated near 0.25." );
        Console.WriteLine( 
            "\nRandom doubles generated with the NextDouble( ) " +
            "method:\n" );

        // Generate and display [rows * cols] random doubles.
        for( int i = 0; i < rows; i++ )
        {
            for( int j = 0; j < cols; j++ )
                Console.Write( "{0,12:F8}", randObj.NextDouble( ) );
            Console.WriteLine( );
        }

        Console.WriteLine( 
            "\nRandom integers generated with the Next( ) " +
            "method:\n" );

        // Generate and display [rows * cols] random integers.
        for( int i = 0; i < rows; i++ )
        {
            for( int j = 0; j < cols; j++ )
                Console.Write( "{0,12}", randObj.Next( ) );
            Console.WriteLine( );
        }

        Console.WriteLine( 
            "\nTo demonstrate the proportional distribution, " +
            "{0:N0} random \nintegers and doubles are grouped " +
            "into {1} equal value ranges. This \n" +
            "is the count of values in each range:\n",
            runCount, distGroupCount );
        Console.WriteLine( 
            "{0,21}{1,10}{2,20}{3,10}", "Integer Range",
            "Count", "Double Range", "Count" );
        Console.WriteLine( 
            "{0,21}{1,10}{2,20}{3,10}", "-------------",
            "-----", "------------", "-----" );

        // Generate random integers and doubles, and then count 
        // them by group.
        for( int i = 0; i < runCount; i++ )
        {
            intCounts[ (int)( (double)randObj.Next( ) / 
                intGroupSize ) ]++;
            realCounts[ (int)( randObj.NextDouble( ) * 
                (double)distGroupCount ) ]++;
        }

        // Display the count of each group.
        for( int i = 0; i < distGroupCount; i++ )
            Console.WriteLine( 
                "{0,10}-{1,10}{2,10:N0}{3,12:N5}-{4,7:N5}{5,10:N0}",
                (int)( (double)i * intGroupSize ),
                (int)( (double)( i + 1 ) * intGroupSize - 1.0 ),
                intCounts[ i ],
                ( (double)i ) / (double)distGroupCount,
                ( (double)( i + 1 ) ) / (double)distGroupCount,
                realCounts[ i ] );
    }
}

/*
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 the number 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.70274545  0.71861388  0.68071795  0.84034066  0.93354743  0.85663774
  0.81804688  0.35177836  0.59208519  0.96031602  0.80442745  0.68718948
  0.98765094  0.88136820  0.40016694  0.78735843  0.30468930  0.60884722
  0.99724610  0.64792400  0.87542366  0.86193142  0.88573527  0.67682807

Random integers generated with the Next( ) method:

  2143307129  1985560852  1491542209  1624708626   545912171  2144440214
  1605065299  1294719830  1191410879  1120886902  1915435155  1514194175
  1795364867  1695595242  1754564804  1407165303  2026939619  1965958920
  1531822446  1145720706  1458838319  1924643339   804498107   445927707

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,916     0.00000-0.10000    10,014
 214748364- 429496728    29,978     0.10000-0.20000    29,965
 429496729- 644245093    50,204     0.20000-0.30000    49,975
 644245094- 858993458    69,870     0.30000-0.40000    70,150
 858993459-1073741823    89,875     0.40000-0.50000    90,180
1073741824-1288490187   110,448     0.50000-0.60000   109,995
1288490188-1503238552   130,290     0.60000-0.70000   130,218
1503238553-1717986917   149,652     0.70000-0.80000   149,300
1717986918-1932735282   170,367     0.80000-0.90000   169,737
1932735283-2147483647   189,400     0.90000-1.00000   190,466
*/
// Example of the Random::Sample( ) method.
using namespace System;

// This derived class converts the uniformly distributed random 
// numbers generated by Random::Sample( ) to another distribution.
ref class RandomProportional: public Random
{
protected:

   // Sample generates a distribution proportional to the value 
   // of the random numbers, in the range [ 0.0, 1.0 ).
   virtual double Sample() override
   {
      return Math::Sqrt( Random::Sample() );
   }

};

int main()
{
   const int rows = 4,cols = 6;
   const int runCount = 1000000;
   const int distGroupCount = 10;
   const double intGroupSize = ((double)Int32::MaxValue + 1.0) / (double)distGroupCount;
   RandomProportional^ randObj = gcnew RandomProportional;
   array<Int32>^intCounts = gcnew array<Int32>(distGroupCount);
   array<Int32>^realCounts = gcnew array<Int32>(distGroupCount);
   Console::WriteLine( "This example of Random::Sample( ) "
   "generates the following output." );
   Console::WriteLine( "\nThe derived RandomProportional class overrides "
   "the Sample method to \ngenerate random numbers "
   "in the range [0.0, 1.0). The distribution \nof "
   "the numbers is proportional to the number values. "
   "For example, \nnumbers are generated in the "
   "vicinity of 0.75 with three times the \n"
   "probability of those generated near 0.25." );
   Console::WriteLine( "\nRandom doubles generated with the NextDouble( ) "
   "method:\n" );
   
   // Generate and display [rows * cols] random doubles.
   for ( int i = 0; i < rows; i++ )
   {
      for ( int j = 0; j < cols; j++ )
         Console::Write( "{0,12:F8}", randObj->NextDouble() );
      Console::WriteLine();

   }
   Console::WriteLine( "\nRandom integers generated with the Next( ) "
   "method:\n" );
   
   // Generate and display [rows * cols] random integers.
   for ( int i = 0; i < rows; i++ )
   {
      for ( int j = 0; j < cols; j++ )
         Console::Write( "{0,12}", randObj->Next() );
      Console::WriteLine();

   }
   Console::WriteLine( "\nTo demonstrate the proportional distribution, "
   "{0:N0} random \nintegers and doubles are grouped "
   "into {1} equal value ranges. This \n"
   "is the count of values in each range:\n", runCount, distGroupCount );
   Console::WriteLine( "{0,21}{1,10}{2,20}{3,10}", "Integer Range", "Count", "Double Range", "Count" );
   Console::WriteLine( "{0,21}{1,10}{2,20}{3,10}", "-------------", "-----", "------------", "-----" );
   
   // Generate random integers and doubles, and then count 
   // them by group.
   for ( int i = 0; i < runCount; i++ )
   {
      intCounts[ (int)((double)randObj->Next() / intGroupSize) ]++;
      realCounts[ (int)(randObj->NextDouble() * (double)distGroupCount) ]++;

   }
   
   // Display the count of each group.
   for ( int i = 0; i < distGroupCount; i++ )
      Console::WriteLine( "{0,10}-{1,10}{2,10:N0}{3,12:N5}-{4,7:N5}{5,10:N0}", (int)((double)i * intGroupSize), (int)((double)(i + 1) * intGroupSize - 1.0), intCounts[ i ], ((double)i) / (double)distGroupCount, ((double)(i + 1)) / (double)distGroupCount, realCounts[ i ] );
}

/*
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 the number 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.90754836  0.90324018  0.53861915  0.83566028  0.44578707  0.62163577
  0.86498862  0.93616774  0.32436787  0.58532497  0.71350292  0.59563486
  0.60962757  0.82088684  0.88599136  0.48414132  0.41008009  0.21823831
  0.79440201  0.89928828  0.93307960  0.94641322  0.37148990  0.71451612

Random integers generated with the Next( ) method:

  1517769790   462406172  2069039901  2021289775  1384348700   231007353
   870275497  1597105824  2056133305  1952619691  2016467783  2090386391
  1792965387   959068365  1939110818   846901181  1940820549  1375295268
  1327509272  1241610292  2040733733  1588387399  2017439082  1175907328

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,930     0.00000-0.10000    10,052
 214748364- 429496728    30,047     0.10000-0.20000    30,261
 429496729- 644245093    49,764     0.20000-0.30000    50,154
 644245094- 858993458    70,366     0.30000-0.40000    70,391
 858993459-1073741823    90,028     0.40000-0.50000    89,683
1073741824-1288490187   110,111     0.50000-0.60000   110,406
1288490188-1503238552   129,261     0.60000-0.70000   129,410
1503238553-1717986917   150,266     0.70000-0.80000   149,900
1717986918-1932735282   169,875     0.80000-0.90000   170,101
1932735283-2147483647   190,352     0.90000-1.00000   189,642
*/

Plattformen

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0, 1.0

Siehe auch

Referenz

Random-Klasse
Random-Member
System-Namespace
NextDouble