C# 使用RNGCryptoServiceProvider来;模拟;掷骰子
我一直在试着用C#来模拟掷6面骰子。我认为使用RNGCSP比随机的要好,因为它更安全 我尝试使用来实现这一点,但有几件事我在代码中没有理解:C# 使用RNGCryptoServiceProvider来;模拟;掷骰子,c#,cryptography,C#,Cryptography,我一直在试着用C#来模拟掷6面骰子。我认为使用RNGCSP比随机的要好,因为它更安全 我尝试使用来实现这一点,但有几件事我在代码中没有理解: 如何使用RNGCSP生成5位数长的数字 如何生成从1到6的数字(不包括零) 1。如何使用RNGCSP生成5位数长的数字? 对于数字,可以使用范围。不过,你必须自己考虑下限。数字的范围在中处理 因此,对于一个5位数字,min将是0或10000,max将是100000,因为max是独占的 2。如何生成从1到6的数字(不包括零)? 基本上相同的方法,生成一个范围
1。如何使用RNGCSP生成5位数长的数字? 对于数字,可以使用范围。不过,你必须自己考虑下限。数字的范围在中处理 因此,对于一个5位数字,
min
将是0
或10000
,max
将是100000
,因为max
是独占的
2。如何生成从1到6的数字(不包括零)? 基本上相同的方法,生成一个范围[1,7],其中7(最大值)是独占的 如果你只是想得到一个骰子结果,你可以这样做(未经测试!):
RNGCryptoServiceProvider rng=new RNGCryptoServiceProvider();
byte[]singleByteBuf=新字节[1];
int max=Byte.MaxValue-Byte.MaxValue%6;
while(true){
rng.GetBytes(singleByteBuf);
int b=单字节缓冲[0];
如果(b
基本上是相同的想法,但is一次只从
RNGCryptoServiceProvider
请求1个字节,因此不会浪费额外的3个字节。1.如何使用RNGCSP生成5位长的数字?
对于数字,你可以使用一个范围。但是你必须自己考虑下限。数字的范围在中处理
因此,对于一个5位数字,min
将是0
或10000
,max
将是100000
,因为max
是独占的
2.如何生成从1到6的数字(不包括零)? 基本上相同的方法,生成一个范围[1,7],其中7(最大值)是独占的 如果你只是想得到一个骰子结果,你可以这样做(未经测试!):
RNGCryptoServiceProvider rng=new RNGCryptoServiceProvider();
byte[]singleByteBuf=新字节[1];
int max=Byte.MaxValue-Byte.MaxValue%6;
while(true){
rng.GetBytes(singleByteBuf);
int b=单字节缓冲[0];
如果(b
基本上是相同的想法,但is一次只从
RNGCryptoServiceProvider
请求1个字节,因此不会浪费额外的3个字节。1.如何使用RNGCSP生成5位长的数字?
对于数字,你可以使用一个范围。但是你必须自己考虑下限。数字的范围在中处理
因此,对于一个5位数字,min
将是0
或10000
,max
将是100000
,因为max
是独占的
2.如何生成从1到6的数字(不包括零)? 基本上相同的方法,生成一个范围[1,7],其中7(最大值)是独占的 如果你只是想得到一个骰子结果,你可以这样做(未经测试!):
RNGCryptoServiceProvider rng=new RNGCryptoServiceProvider();
byte[]singleByteBuf=新字节[1];
int max=Byte.MaxValue-Byte.MaxValue%6;
while(true){
rng.GetBytes(singleByteBuf);
int b=单字节缓冲[0];
如果(b
基本上是相同的想法,但is一次只从
RNGCryptoServiceProvider
请求1个字节,因此不会浪费额外的3个字节。1.如何使用RNGCSP生成5位长的数字?
对于数字,你可以使用一个范围。但是你必须自己考虑下限。数字的范围在中处理
因此,对于一个5位数字,min
将是0
或10000
,max
将是100000
,因为max
是独占的
2.如何生成从1到6的数字(不包括零)? 基本上相同的方法,生成一个范围[1,7],其中7(最大值)是独占的 如果你只是想得到一个骰子结果,你可以这样做(未经测试!):
RNGCryptoServiceProvider rng=new RNGCryptoServiceProvider();
byte[]singleByteBuf=新字节[1];
int max=Byte.MaxValue-Byte.MaxValue%6;
while(true){
rng.GetBytes(singleByteBuf);
int b=单字节缓冲[0];
如果(b
基本上是相同的想法,但is一次只从
RNGCryptoServiceProvider
请求1个字节,因此它不会再浪费3个字节。模拟掷骰子需要多少安全性?我需要它完全随机。“如何生成1到6的数字(不包括零)?”该示例仅使用:return(byte)((随机数[0]%numberSides)+1)但是,如果随机性很重要的话,还有一些额外的事情要考虑。如果RNGCSP返回一个字节,它的值可以从0到255。因此,你可以把它变成6和1。但是这样做,256个可能的值。使用Idle_Mind公式得到的1、2、3或4的值将在256次中分别出现43次。5和6在256次中仅出现42次。因此,在使用mod之前,您应该抛出任何字节值252-255,然后重新滚动。@Preston Guillot:如果您正在运行在线赌场或类似游戏,那么您的随机数n需要100%安全。如果你的骰子卷显示出任何偏差,那么某人,某些人
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;
}
}