国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

c#的random shuffle

2019-11-18 16:45:32
字體:
來源:轉載
供稿:網友

2006馬上就要過去了,blog也長草了。貼上一點代碼,意思一下

      前段時間在C#里需要用到random shuffle功能,一時沒找到合適的代碼,就按自己的理解寫了一段,所得到結果也能滿足自己的需要。值得注意的一點是隨機數生成器的選擇。直接以Random做為隨機數生成器因為時鐘精度問題,在一個小的時間段內會得到同樣的偽隨機數序列,你shuffle后會得到同一個結果。.net提供了RNGCryptoServicePRovider可以避免這種情況,下面是幾種用法的示例

 1     /// <summary>
 2     /// RandomShuffle
 3     /// WuErPing 2006/12/07
 4     /// </summary>
 5     public sealed class RandomShuffle
 6     {
 7         private RandomShuffle() { }
 8
 9         // pseudo-random number generator, using a time-dependent default seed value.
10         static public List<int> Shuffle(int size)
11         {
12             List<int> list = new List<int>(size);
13             for (int i = 0; i < size; ++i)
14             {
15                 list.Insert(i, i);
16             }
17             System.Random random = new Random();
18             for (int i = 0; i < list.Count; ++i)
19             {
20                 int var = random.Next(0, list.Count);
21                 int temp = list[i];
22                 list[i] = list[var];
23                 list[var] = temp;
24             }
25
26             return list;
27         }
28
29         // using a RNGCryptoServiceProvider().GetHashCode() seed value
30         static public List<int> ShuffleEx(int size)
31         {
32             List<int> list = new List<int>(size);
33             for (int i = 0; i < size; ++i)
34             {
35                 list.Insert(i, i);
36             }
37             System.Random random = new Random(new RNGCryptoServiceProvider().GetHashCode());
38             for (int i = 0; i < list.Count; ++i)
39             {
40                 int var = random.Next(0, list.Count);
41                 int temp = list[i];
42                 list[i] = list[var];
43                 list[var] = temp;
44             }
45
46             return list;
47         }
48
49         // Cryptographic random number generators create cryptographically strong random values
50         static public List<int> ShufflePro(int size)
51         {
52             List<int> list = new List<int>(size);
53             for (int i = 0; i < size; ++i)
54             {
55                 list.Insert(i, i);
56             }
57             byte[] randomBytes = new Byte[4];
58             RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
59             for (int i = 0; i < list.Count; ++i)
60             {
61                 rng.GetNonZeroBytes(randomBytes);
62                 int randomSeed = (randomBytes[0] << 24) | (randomBytes[1] << 16) | (randomBytes[2] << 8) | randomBytes[3];
63                 int var = randomSeed % list.Count;
64                 //var = System.Math.Abs(var);
65                 if (var < 0) var *= -1;
66                 int temp = list[i];
67                 list[i] = list[var];
68                 list[var] = temp;
69             }
70             return list;
71         }
72     }
注:如果要深究random shuffle算法,可以看標準C++的random_shuffle的實現。根據SGI的文檔http://www.sgi.com/tech/stl/random_shuffle.html,算法來自
[1] This algorithm is described in section 3.4.2 of Knuth (D. E. Knuth, The Art of Computer Programming. Volume 2: Seminumerical Algorithms, second edition. Addison-Wesley, 1981). Knuth credits Moses and Oakford (1963) and Durstenfeld (1964).

附:vc8的random_shuffle的實現

 1         // TEMPLATE FUNCTION random_shuffle
 2 template<class _RanIt,
 3     class _Diff> inline
 4     void _Random_shuffle(_RanIt _First, _RanIt _Last, _Diff *)
 5     {    // shuffle [_First, _Last)
 6     _DEBUG_RANGE(_First, _Last);
 7     const int _RANDOM_BITS = 15;    // minimum random bits from rand()
 8     const int _RANDOM_MAX = (1U << _RANDOM_BITS) - 1;
 9
10     _RanIt _Next = _First;
11     for (unsigned long _Index = 2; ++_Next != _Last; ++_Index)
12         {    // assume unsigned long big enough for _Diff count
13         unsigned long _Rm = _RANDOM_MAX;
14         unsigned long _Rn = ::rand() & _RANDOM_MAX;
15         for (; _Rm < _Index && _Rm != ~0UL;
16             _Rm = _Rm << _RANDOM_BITS | _RANDOM_MAX)
17             _Rn = _Rn << _RANDOM_BITS
18                 | (::rand() & _RANDOM_MAX);    // build random value
19
20         std::iter_swap(_Next, _First + _Diff(_Rn % _Index));    // swap a pair
21         }
22     }
23
http://m.survivalescaperooms.com/WuErPIng/archive/2006/12/31/609224.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蓬莱市| 眉山市| 侯马市| 辉县市| 萝北县| 乌鲁木齐市| 晋城| 沭阳县| 蓝田县| 当涂县| 盐山县| 新兴县| 东台市| 靖远县| 许昌市| 察隅县| 大城县| 房产| 拜泉县| 瑞安市| 三江| 中江县| 分宜县| 依安县| 梁河县| 合川市| 东丽区| 溆浦县| 高阳县| 开平市| 天台县| 平顶山市| 台安县| 老河口市| 镇江市| 化隆| 随州市| 张家港市| 保德县| 望城县| 巴中市|