使用RNGCryptoServiceProvider“模拟”投掷骰子

时间:2015-08-09 15:46:50

标签: c# cryptography

我一直在尝试模拟在C#中滚动一个6面骰子。我认为使用RNGCSP比Random更好,因为它更安全。

我尝试使用MSDN's example code来实现这一目标,但有些事情我从代码中无法理解:

  1. 如何使用RNGCSP生成5位数的长数字?
  2. 如何生成1到6的数字(不包括零)?

1 个答案:

答案 0 :(得分:3)

<强> 1。如何使用RNGCSP生成5位数的长数字?

对于数字,您可以使用范围。你必须考虑自己的下限。数字范围在RNGCryptoServiceProvider中处理。

因此,对于5位数字min010000max将为100000,因为max独家

<强> 2。如何生成1到6的数字(不包括零)?

基本上以同样的方式,你生成一个范围[1,7],其中7 - max值 - 是独占的。

如果你只想要一个骰子结果,你可以做这样的事情(未经测试!):

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] singleByteBuf = new byte[1];
int max = Byte.MaxValue - Byte.MaxValue % 6;
while (true) {
    rng.GetBytes(singleByteBuf);
    int b = singleByteBuf[0];
    if (b < max) {
        return b % 6 + 1;
    }
 }

基本上是相同的想法,但是只能从RNGCryptoServiceProvider一次请求1个字节,所以它不会浪费3个额外的字节。