首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RNGCryptoServiceProvider“模拟”掷骰子

使用RNGCryptoServiceProvider“模拟”掷骰子
EN

Stack Overflow用户
提问于 2015-08-09 15:46:49
回答 1查看 529关注 0票数 0

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

我试着使用MSDN示例代码来实现这一点,但是有一些事情我没有从代码中理解:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-09 23:00:35

1.如何使用RNGCSP?生成5位长数字

对于数字,您可以使用一个范围。不过,你得考虑下界。数字的范围在RNGCryptoServiceProvider中处理。

因此,对于一个5位数的数字,min将是010000,而max将是100000,因为max是唯一的。

2.如何生成从1到6的数字(不包括零)?

基本上相同的方式是,生成一个范围[1,7],其中7- max值--是排他性的。

如果您只想得到一个骰子结果,您可以这样做(未经测试!):

代码语言:javascript
复制
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请求一个字节,这样就不会浪费3个额外的字节。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31906015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档