產生RNGCryptoServiceProvider隨機數和隨機gb2312一級中文(根據網上的修改)

來源:互聯網
上載者:User

隨機數用的是msdn上的例子,不過做了下修改,隨機中文因為網上找到的寫法很重複,所以按照gb2312標準修改了下

隨機數:

/// <summary>        /// 產生小於輸入值絕對值的隨機數        /// </summary>        /// <param name="NumSides"></param>        /// <returns></returns>        public static int Next(this int numSeeds)        {            numSeeds = Math.Abs(numSeeds);            if (numSeeds <= 1)            {                return 0;            }                        int length = 4;            if (numSeeds <= byte.MaxValue)            {                length = 1;            }            else if (numSeeds <= short.MaxValue)            {                length = 2;            }            return Next(numSeeds, length);        }        private static int Next(int numSeeds, int length)        {            // Create a byte array to hold the random value.            byte[] buffer = new byte[length];            // Create a new instance of the RNGCryptoServiceProvider.            System.Security.Cryptography.RNGCryptoServiceProvider Gen = new System.Security.Cryptography.RNGCryptoServiceProvider();            // Fill the array with a random value.            Gen.GetBytes(buffer);            // Convert the byte to an uint value to make the modulus operation easier.            uint randomResult = 0x0;//這裡用uint作為產生的隨機數            for (int i = 0; i < length; i++)            {                randomResult |= ((uint)buffer[i] << ((length - 1 - i) * 8));            }            // Return the random number mod the number            // of sides.  The possible values are zero-based            return (int)(randomResult % numSeeds);        }

 

隨機中文:

/*             *   gb2312 80             *              *   01-09區為特殊符號。                *   16-55區為一級漢字,按拼音排序。               *   56-87區為二級漢字,按部首/筆畫排序。                *   10-15區及88-94區則未有編碼。          *            * 所有數字都是從 1 開始             *                * 每個漢字及符號以兩個位元組來表示。             * 第一個位元組稱為“高位位元組”(也稱“區位元組)”,upper byte             * 第二個位元組稱為“低位位元組”(也稱“位位元組”)。low byte               * “高位位元組”使用了0xA1-0xF7(把01-87區的區號加上0xA0),             * “低位位元組”使用了0xA1-0xFE(把01-94加上 0xA0)。              * 由於一級漢字從16區起始,漢字區的“高位位元組”的範圍是0xB0-0xF7,             * “低位位元組”的範圍是0xA1-0xFE,             * 佔用的碼位是 72*94=6768。             * 其中有5個空位是D7FA-D7FE(55區90-94)                */        public static string GetRandomPopularSimplifiedChinese(this int length)        {            if (length <= 0)            {                return string.Empty;            }            byte minUpper = 16;            byte maxUpper = 55;            byte rangeLow = 94;            int addParamer = 0xA0;            StringBuilder tempStr = new StringBuilder();            int tempUpper = maxUpper - minUpper + 1;            Encoding gb = Encoding.GetEncoding("gb2312");            for (int i = 0; i < length; i++)            {                int rdUpperValue = Next(tempUpper) + minUpper;                int rdLowValue;                do                {                    rdLowValue = Next(rangeLow) + 1;//索引從1開始,所以94種子產生的隨機數+1                }                while (rdUpperValue == maxUpper && rdLowValue >= 90);//D7FA-D7FE是空位(55區90-94)                rdUpperValue += addParamer;                rdLowValue += addParamer;                byte[] byteArray = new byte[] { (byte)rdUpperValue, (byte)rdLowValue };                tempStr.Append(gb.GetString(byteArray));            }            return tempStr.ToString();        }

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.