Random 学习笔记

Post on by michaelyin

这几天在学习算法,所以生成随机数组就不可避免了,以前只是知道Random 这个类是用来生成随机数的但是没怎么用过,这次正好趁这个机会好好了解一下,在园子里面看了下别人写的文章和代码,自己又在VS里面跑了几次,这里就把一些觉得useful的东东记下来。

Random是用来生成伪随机数的类,它根据生成对象时候的随机种子进行复杂的计算,然后生成伪随机数。如果我们在调用构造函数的时候没有指定随机种子,那么默认情况下它会采用系统的时间产生的值来做随机种子,这样的话那么我们在一次函数调用里面不同的Random对象有可能是采用相同的随机种子,那么有可能造成生成重复的随机数。关于随机种子的选取问题,等下会专门讲解。Random里面要用到比较多的方法就是obj.Next()这个方法,用于根据随机种子按照复杂的算法生成伪随机数,这个方法有多个重载的方法,可以限定需要生成的数字的最大值和最小值,基本上Random经常使用的就是这么几个东西。

下面来讲一下如何避免生成重复的随机种子,以此来避免产生一连串重复的随机数。其实关键点就在于生成随机数的随机种子必须不一样,一种方法就是采用Guid.NewGuid().GetHashCode()来当做随机种子,由于Guid重复的可能性非常小,而且Hash算法不同的输入产生的结果也是不同的,所以可以很好的解决随机种子相同的问题。还有一种方法就是采用

long tick = DateTime.Now.Ticks; 
Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick >> 32)); 

这个方法来达到效果

园子里面有的朋友是用算法来完成生成不重复随机数的,这样可以完全避免重复数据的发生。

public static int[] CreateInstanceType2()
{
    int[] result = new int[10];
    int tmp = -1;
    Random random ...

算法学习之插入排序

Post on by michaelyin

最近开始学习算法方面的东西,用的资料是算法导论,在这里也顺便把学习过程中的心得,体会等,在这里做个总结,并给出自己用c#实现的代码。

说个简单点的例子,就拿算法导论一书中的Poker的例子来说吧。刚开始我们的手上有一张牌,而这张牌肯定是没有排序的大小顺序问题的,桌子上放的牌就是剩下的都没有排序的那些牌,我们将牌从桌子上拿起来,然后从右往左边看,看到一个比我们刚摸上来的牌小的牌后,把手上这个牌右边的牌都朝右边挪动一个位子,然后把刚摸起来的这张牌插入到空出来的这个位置中去。

下面给出实现的代码

/// <summary>
/// 插入排序
/// </summary>
/// <param name="arrayToSort">需要排序的数组</param>
public static void InsertionSort(int[] arrayToSort)
{
    //从第二个元素开始
    for (int j = 1; j < arrayToSort.Length; j++)
    {
        int key = arrayToSort[j];
        int i = j - 1;
        //注意防止索引越界
        while (i > -1 && arrayToSort[i] > key)
        {
            arrayToSort[i + 1] = arrayToSort[i];
            i--;
        }
        arrayToSort[i + 1] = key ...

母版页中的js和css文件引用路径的问题

Post on by michaelyin

今天在做项目的时候发现了母版页中引用css文件和js文件路径在内容页中发生路径错误。

先来说说问题发生的情况吧,比如我在一个母版页中引用了一个js文件和一个css样式表文件,路径是使用的相对路径,代码是这样子的

<link href="../css/dtree.css" rel="stylesheet" type="text/css" />
<script src="../js/dtree.js" type="text/javascript"></script>

母版页我放在项目文件MasterPage文件夹中,脚本文件和css文件我分别放在相应的文件夹中,在Design模式中这也是可见的,然后我加入内容页,内容页假设我放在网站根目录下面,然后放入内容,进入后台进行编程,基本上完成以后想看看效果,就F5进行了调试,不过缺发现js没有起作用,在IE下查看源文件,发现引用处的css和js的路径发生了变化,如下所示

<link href="css/dtree.css" rel="stylesheet" type="text/css" />
<script src="../js/dtree.js" type="text/javascript"></script>

从这里可以看到 ...


权限设计学习总结

Post on by michaelyin

看着师兄师姐忙着笔试,找工作,不知不觉已经过去一年了。。明年就轮到自己了。。。加油。。。

以前对权限两字的理解一直不是很清楚,甚至可以说是错误,连用户登录我一直都都以为是属于权限管理里面的,前几天看了园子里面的两篇文章,顺便又乘机查了下相关的资料,感觉对于权限这两个字又有了全新的认识。

先来百度百科里面对权限管理的解释:权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。PS用户登陆属于用户身份认证,本质上并不属于权限管理,不应该将盖帘混淆。

其实说简单点,权限管理也就是让有权限的用户得到授权的资源,这个资源可以是具体的数据,也可以是某种抽象的功能。它的本质就是这个。如何判断用户是否有权限并将没有权限的用户阻止掉访问资源,这个就是权限的管控,比如Asp.Net中可以通过Page_Load,HttpModule等等进行管控,实现的方式是多种多样的,但是实现的本质其实并没有多大的差别。

管控的大致步骤就是首先得到用户,然后得到资源,对资源和用户进行匹配,如果不匹配则进行阻止的操作,比如跳向提示页面,或者隐藏相应的控件。

项目中经常使用的权限判定方法就是将需要进行权限管理页面继承自一个实现了管控方法的页面基类BasePage,判定方法写在页面初始化的事件中,然后根据复写的属性值来进行判定,实现管控。

提到权限设计,有个名词在这里也就有必要交代一下。RBAC,基于角色的访问控制(Role-Based Access Control),虽然权限管理如果做极端点的话其实一个用户ID和一个资源对应ID的对应表就足够,但是如果设计到用户权限的变更的话或者其他的权限管理操作的话,那么单纯的用户ID和资源ID对应的表结构就不是很好了。而RBAC则在用户ID和资源ID中添加了一个角色,通过将用户ID添加进角色与否和对角色,资源ID的分配来提供了更灵活的模型结构。

一般来说,RBAC在数据库中比较多的做法是用五张数据表,用户表,角色表,权限表,然后是两张连接表,这也基本可以认为是一种比较经典的结构吧。当然了,对于特定的系统来说,有些表也是不一定都需要的,比如权限表有的时候并不一定是会分离的。

理论知识懂了许多 ...


泛型约束学习总结

Post on by michaelyin

最近在学习代码的时候发现对泛型约束不是很了解,花时间在网上学习了下,现在在这里做个总结吧。

泛型约束主要就是用于在泛型类中对于泛型类所接受的参数的某些特性进行设置。先来说说为什么要使用泛型约束吧。打个比方,一个泛型基类中的某个方法的实现需要调用参数类型生成的实例的Compare方法,但是参数类型不是我们所能够控制的,我们需要在程序编译的时候加入对参数类型的检查,这个时候就要用到泛型约束了。

泛型约束基本上有五种:

  • 值类型约束:要求泛型参数必须是值类型,例如int,short以及自定义的stuct等

public class MyClass2
where T : struct//这个泛型类只接受值类型的泛型参数
{
}

  • 引用类型约束:要求泛型参数必须是引用类型,例如string,object,以及自定义的class

public class MyClass
where T:class//这个泛型类只接受引用类型的泛型参数
{
}

  • 构造函数约束:要求泛型参数必须有构造函数

public class MyClass3
where T : new()
{
}

  • 接口约束:要求泛型参数必须实现某个接口

public class MyClass4
where T : System.IComparable
{
}

  • 基类约束:要求泛型参数必须继承某个基类

public class MyClass5
where T : Customer
{
}

BlogEngine中的BusinessBase泛型基类就使用到了泛型基类,下面我贴上代码

public abstract class BusinessBase<TYPE, KEY> : IDataErrorInfo ...