Last active
August 29, 2015 14:03
-
-
Save micdenny/86911d58ff6215106dfa to your computer and use it in GitHub Desktop.
Roll the dice
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Security.Cryptography; | |
namespace ConsoleApplication1 | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
var r = RollDice(250); | |
Console.WriteLine(r); | |
} | |
private static RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider(); | |
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; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment