GoGreen PC TuneUp™
Learn More

this is how we code sign our software and ssl encrypt our websites from our affiliate partner SSL.com
MTNCOMP | List | Table


myBlog Home


RNGCryptoServiceProvider and running odds

by Mountain Computers Inc., Publication Date: Tuesday, October 15, 2019
View Count: 307, Keywords: RNGCryptoServiceProvider, Random, C++, C#, Hashtags: #RNGCryptoServiceProvider #Random #C++ #C#

We had to quickly test some crypto random number generation for salt+hash functionality for another system.
This came from a Microsoft sample and we just wanted to test it.. not bad...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO;
using System.Security.Cryptography;

namespace WindowsFormsApp_RNGSP
    public partial class Form1 : Form
        public Form1()

        private static RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
        private void Form1_Load(object sender, EventArgs e)
            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);


        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];
                // Fill the array with a random value.
            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;

more to come...

if you found this article helpful, consider contributing $10, 20 an Andrew Jackson or so..to the author. more authors coming soon
FYI we use paypal or patreon, patreon has 3x the transaction fees, so we don't, not yet.

© 2021 myBlog™ v1.1 All rights reserved. We count views as reads, so let's not over think it.