隨機數用的是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(); }