RNGCryptoServiceProvider 类  
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
注意
RNGCryptoServiceProvider is obsolete. To generate a random number, use one of the RandomNumberGenerator static methods instead.
使用加密服务提供程序 (CSP) 提供的实现来实现加密随机数生成器 (RNG)。 此类不能被继承。
public ref class RNGCryptoServiceProvider sealed : System::Security::Cryptography::RandomNumberGeneratorpublic sealed class RNGCryptoServiceProvider : System.Security.Cryptography.RandomNumberGenerator[System.Obsolete("RNGCryptoServiceProvider is obsolete. To generate a random number, use one of the RandomNumberGenerator static methods instead.", DiagnosticId="SYSLIB0023", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public sealed class RNGCryptoServiceProvider : System.Security.Cryptography.RandomNumberGenerator[System.Runtime.InteropServices.ComVisible(true)]
public sealed class RNGCryptoServiceProvider : System.Security.Cryptography.RandomNumberGeneratortype RNGCryptoServiceProvider = class
    inherit RandomNumberGenerator[<System.Obsolete("RNGCryptoServiceProvider is obsolete. To generate a random number, use one of the RandomNumberGenerator static methods instead.", DiagnosticId="SYSLIB0023", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
type RNGCryptoServiceProvider = class
    inherit RandomNumberGenerator[<System.Runtime.InteropServices.ComVisible(true)>]
type RNGCryptoServiceProvider = class
    inherit RandomNumberGeneratorPublic NotInheritable Class RNGCryptoServiceProvider
Inherits RandomNumberGenerator- 继承
- 属性
示例
下面的代码示例演示如何使用 RNGCryptoServiceProvider 类创建随机数。
//The following sample uses the Cryptography class to simulate the roll of a dice.
using namespace System;
using namespace System::IO;
using namespace System::Text;
using namespace System::Security::Cryptography;
ref class RNGCSP
{
public:
    // Main method.
    static void Main()
    {
        const int totalRolls = 25000;
        array<int>^ results = gcnew array<int>(6);
        // Roll the dice 25000 times and display
        // the results to the console.
        for (int x = 0; x < totalRolls; x++)
        {
            Byte roll = RollDice((Byte)results->Length);
            results[roll - 1]++;
        }
        for (int i = 0; i < results->Length; ++i)
        {
            Console::WriteLine("{0}: {1} ({2:p1})", i + 1, results[i], (double)results[i] / (double)totalRolls);
        }
    }
    // This method simulates a roll of the dice. The input parameter is the
    // number of sides of the dice.
    static Byte RollDice(Byte numberSides)
    {
        if (numberSides <= 0)
            throw gcnew ArgumentOutOfRangeException("numberSides");
        // Create a new instance of the RNGCryptoServiceProvider.
        RNGCryptoServiceProvider^ rngCsp = gcnew RNGCryptoServiceProvider();
        // Create a byte array to hold the random value.
        array<Byte>^ randomNumber = gcnew array<Byte>(1);
        do
        {
            // Fill the array with a random value.
            rngCsp->GetBytes(randomNumber);
        }
        while (!IsFairRoll(randomNumber[0], numberSides));
        // Return the random number mod the number
        // of sides.  The possible values are zero-
        // based, so we add one.
        return (Byte)((randomNumber[0] % numberSides) + 1);
    }
private:
    static bool IsFairRoll(Byte roll, Byte numSides)
    {
        // There are MaxValue / numSides full sets of numbers that can come up
        // in a single byte.  For instance, if we have a 6 sided die, there are
        // 42 full sets of 1-6 that come up.  The 43rd set is incomplete.
        int fullSetsOfValues = Byte::MaxValue / numSides;
        // If the roll is within this range of fair values, then we let it continue.
        // In the 6 sided die case, a roll between 0 and 251 is allowed.  (We use
        // < rather than <= since the = portion allows through an extra 0 value).
        // 252 through 255 would provide an extra 0, 1, 2, 3 so they are not fair
        // to use.
        return roll < numSides * fullSetsOfValues;
    }
};
int main()
{
    RNGCSP::Main();
}
//The following sample uses the Cryptography class to simulate the roll of a dice.
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
class RNGCSP
{
    private static RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
    // Main method.
    public static void Main()
    {
        const int totalRolls = 25000;
        int[] results = new int[6];
        // Roll the dice 25000 times and display
        // the results to the console.
        for (int x = 0; x < totalRolls; x++)
        {
            byte roll = RollDice((byte)results.Length);
            results[roll - 1]++;
        }
        for (int i = 0; i < results.Length; ++i)
        {
            Console.WriteLine("{0}: {1} ({2:p1})", i + 1, results[i], (double)results[i] / (double)totalRolls);
        }
        rngCsp.Dispose();
    }
    // This method simulates a roll of the dice. The input parameter is the
    // number of sides of the dice.
    public static byte RollDice(byte numberSides)
    {
        if (numberSides <= 0)
            throw new ArgumentOutOfRangeException("numberSides");
        // Create a byte array to hold the random value.
        byte[] randomNumber = new byte[1];
        do
        {
            // Fill the array with a random value.
            rngCsp.GetBytes(randomNumber);
        }
        while (!IsFairRoll(randomNumber[0], numberSides));
        // Return the random number mod the number
        // of sides.  The possible values are zero-
        // based, so we add one.
        return (byte)((randomNumber[0] % numberSides) + 1);
    }
    private static bool IsFairRoll(byte roll, byte numSides)
    {
        // There are MaxValue / numSides full sets of numbers that can come up
        // in a single byte.  For instance, if we have a 6 sided die, there are
        // 42 full sets of 1-6 that come up.  The 43rd set is incomplete.
        int fullSetsOfValues = Byte.MaxValue / numSides;
        // If the roll is within this range of fair values, then we let it continue.
        // In the 6 sided die case, a roll between 0 and 251 is allowed.  (We use
        // < rather than <= since the = portion allows through an extra 0 value).
        // 252 through 255 would provide an extra 0, 1, 2, 3 so they are not fair
        // to use.
        return roll < numSides * fullSetsOfValues;
    }
}
'The following sample uses the Cryptography class to simulate the roll of a dice.
Imports System.IO
Imports System.Text
Imports System.Security.Cryptography
Class RNGCSP
    Private Shared rngCsp As New RNGCryptoServiceProvider()
    ' Main method.
    Public Shared Sub Main()
        Const totalRolls As Integer = 25000
        Dim results(5) As Integer
        ' Roll the dice 25000 times and display
        ' the results to the console.
        Dim x As Integer
        For x = 0 To totalRolls
            Dim roll As Byte = RollDice(System.Convert.ToByte(results.Length))
            results((roll - 1)) += 1
        Next x
        Dim i As Integer
        While i < results.Length
            Console.WriteLine("{0}: {1} ({2:p1})", i + 1, results(i), System.Convert.ToDouble(results(i)) / System.Convert.ToDouble(totalRolls))
            i += 1
        End While
        rngCsp.Dispose()
    End Sub
    ' This method simulates a roll of the dice. The input parameter is the
    ' number of sides of the dice.
    Public Shared Function RollDice(ByVal numberSides As Byte) As Byte
        If numberSides <= 0 Then
            Throw New ArgumentOutOfRangeException("NumSides")
        End If 
        ' Create a byte array to hold the random value.
        Dim randomNumber(0) As Byte
        Do
            ' Fill the array with a random value.
            rngCsp.GetBytes(randomNumber)
        Loop While Not IsFairRoll(randomNumber(0), numberSides)
        ' Return the random number mod the number
        ' of sides.  The possible values are zero-
        ' based, so we add one.
        Return System.Convert.ToByte(randomNumber(0) Mod numberSides + 1)
    End Function
    Private Shared Function IsFairRoll(ByVal roll As Byte, ByVal numSides As Byte) As Boolean
        ' There are MaxValue / numSides full sets of numbers that can come up
        ' in a single byte.  For instance, if we have a 6 sided die, there are
        ' 42 full sets of 1-6 that come up.  The 43rd set is incomplete.
        Dim fullSetsOfValues As Integer = [Byte].MaxValue / numSides
        ' If the roll is within this range of fair values, then we let it continue.
        ' In the 6 sided die case, a roll between 0 and 251 is allowed.  (We use
        ' < rather than <= since the = portion allows through an extra 0 value).
        ' 252 through 255 would provide an extra 0, 1, 2, 3 so they are not fair
        ' to use.
        Return roll < numSides * fullSetsOfValues
    End Function 'IsFairRoll
End Class
注解
重要
此类型实现 IDisposable 接口。 在使用完类型后,您应直接或间接释放类型。 若要直接释放类型,请在 try/catch 块中调用其 Dispose 方法。 若要间接释放类型,请使用 using(在 C# 中)或 Using(在 Visual Basic 中)等语言构造。 有关详细信息,请参阅 IDisposable 接口主题中的“使用实现 IDisposable 的对象”一节。
构造函数
| RNGCryptoServiceProvider() | 
				已过时.
			 初始化 RNGCryptoServiceProvider 类的新实例。 | 
| RNGCryptoServiceProvider(Byte[]) | 
				已过时.
			 初始化 RNGCryptoServiceProvider 类的新实例。 | 
| RNGCryptoServiceProvider(CspParameters) | 
				已过时.
			 使用指定的参数初始化 RNGCryptoServiceProvider 类的新实例。 | 
| RNGCryptoServiceProvider(String) | 
				已过时.
			 初始化 RNGCryptoServiceProvider 类的新实例。 | 
方法
| Dispose() | 
		已过时.
	 在派生类中重写时,释放由 RandomNumberGenerator 类的当前实例使用的所有资源。(继承自 RandomNumberGenerator) | 
| Dispose(Boolean) | 
		已过时.
	 在派生类中被重写时,释放由 RandomNumberGenerator 使用的非托管资源,也可以根据需要释放托管资源。(继承自 RandomNumberGenerator) | 
| Equals(Object) | 
		已过时.
	 确定指定对象是否等于当前对象。(继承自 Object) | 
| Finalize() | 
				已过时.
			 释放 RNGCryptoServiceProvider 类使用的资源。 | 
| GetBytes(Byte[]) | 
				已过时.
			 用经过加密的强随机值序列填充字节数组。 | 
| GetBytes(Byte[], Int32, Int32) | 
				已过时.
			 使用加密型强随机值序列填充指定字节数组(从指定索引处开始,填充指定字节数)。 | 
| GetBytes(Byte[], Int32, Int32) | 
		已过时.
	 用加密型强随机值序列填充指定的字节数组。(继承自 RandomNumberGenerator) | 
| GetBytes(Span<Byte>) | 
				已过时.
			 使用加密型强随机字节填充范围。 | 
| GetBytes(Span<Byte>) | 
		已过时.
	 使用加密型强随机字节填充范围。(继承自 RandomNumberGenerator) | 
| GetHashCode() | 
		已过时.
	 作为默认哈希函数。(继承自 Object) | 
| GetNonZeroBytes(Byte[]) | 
				已过时.
			 用经过加密的强随机非零值序列填充字节数组。 | 
| GetNonZeroBytes(Span<Byte>) | 
				已过时.
			 使用加密型强随机非零值序列填充字节范围。 | 
| GetNonZeroBytes(Span<Byte>) | 
		已过时.
	 使用加密型强随机非零值序列填充字节范围。(继承自 RandomNumberGenerator) | 
| GetType() | 
		已过时.
	 获取当前实例的 Type。(继承自 Object) | 
| MemberwiseClone() | 
		已过时.
	 创建当前 Object 的浅表副本。(继承自 Object) | 
| ToString() | 
		已过时.
	 返回表示当前对象的字符串。(继承自 Object) | 
适用于
线程安全性
此类型是线程安全的。