网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C#应用
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.c# 正确读取存储中文,以及如何获.
.C#代表元及事件触发.
.c#中分割字符串的几种方法.
.如何获取当前操作系统的软件版本.
.C#可逆加密算法收集.
.借用VB的My,C#照样条条大路通罗.
.Sql server存储过程和C#分页类简.
.关于C#中枚举打印机.
.C#反编译微软MSDN2003的帮助文档.
.图片保存到数据库和从数据库读取.
.如何用C#语言构造蜘蛛程序.
.读取指定盘符的硬盘序列号.
.C#消息队列应用程序 -1.
.如何在C#中使用Win32和其他库.
.Visual C#创建和使用ActiveX组件.
.用c#写的asp+域名查询程序.
.序列化和反序列化XML应用程序设置.
.c#操作word表格.
.SQLServer2000数据访问基类.
.通过COM来获取CookieContainer,简.

c#的random shuffle

发表日期:2007-1-4


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://www.cnblogs.com/WuErPIng/archive/2006/12/31/609224.html

上一篇:C#编写发送电子邮件 人气:5765
下一篇:如何在控件的设计时得到窗体设计器中的所有控件 人气:5077
浏览全部c#的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐