insert
into
a(id,姓名,性别)
values
(trunc(dbms_randomvalue(1,100)),'小明','男');
commit;
----trunc(dbms_randomvalue(1,100))
随机生成一个1~100以内的整数。
公式:(上限 - 下限 + 1 ) * rand() - 下限
介绍:John von Neumann说:Any one who considers arithmetical methods of producing random digits is , of course, in a state of sin
所以,在讨论算法实现随机数的时候,总是说“伪随机数”。
现在,应用最广的随机数生成算法是由Derrick Henry Lehmer1951年给出的线性同余法:
Xn+1 = ( aXn + c ) mod m, n>=0
在上一篇伪随机数的论述中,并没有给出X0, a, c, m的取值规则,只是给出了ANSI C和Microsoft Visual C++的实现。
在这儿我们可以自己先思考一下,我们期望从上式中得到的随机数应该满足:
1) 上式的输出足够随机,这是最基本的要求;
2) 上式给出尽量多的输出,越接近m个越好(不可能超过m),即周期尽量长,最好为m,这样才能保证上式满足均匀分布(m个数在周期m中各出现一次);
3) 上式的生成速度足够快。
最容易想到的,m的取值为计算机字大小(如2^32或2^64)。
但是这儿有个很严重的问题:Xn低位的随机性很弱。原因如下:
令d|m, 且
Yn = Xn mod d
则
Yn+1 = ( ( aXn + c ) mod m ) mod d
= ( aYn + c ) mod d
上述表达式的意义即:Yn为Xn低k位(d=2^k),这样的Yn序列形成周期为d甚至更短的同余序列。举例说明:d为2^1时,Yn为Xn的最低位(可假定为1或0),若Yn+1 != Yn,则Yn+2 == Yn必定成立,仅当a、c皆为奇数时Yn、Yn+1将0、1交替,否则,为常数(0或1)。
暂时抛开随机性不管,先找到周期为m的随机序列中的取值规则。
Donald Knuth在The Art of Computer Programming, Volume 2: Seminumerical Algorithms中的3212节对m, a, c和X0取值规则的表述:
1) gcd(c, m) = 1 即c, m互素,再白一点,c, m除1之外没有其他公因子;
2) 任给质数p, p|m ==> p|(a-1) 即m%p==0,则(a-1)%p==0。
3) 4|m ==> 4|(a-1) 即m%4==0,则(a-1)%4==0。
这个证明过程对于我这样的数论基础不是很扎实的搞应用技术的人来说有点难以理解了。有兴趣的话,还是去看3212的证明吧:-)。
上面的规则告诉我们,满足了上述规则后,可以保证序列周期为m。对于前面提到的关于随机性的问题,既然Xn低位的随机性比较弱,可以只取Xn的高位作为输出。高位的随机性和统计意义由a, c确定,其取值涉及统计检验,具体的也还是看33吧。
这篇文章解决了具有统计意义的随机数的部分理论问题。
PS: 之前曾经BS过Windows Live Writer,当时觉得Writer编辑功能太少,不能直接设定链接文字的字体颜色,知道CSS可以设定之后,又觉得Word 2007编辑的Blog转成html之后太大,而且也知道Word 2007上面是可以设置链接的target为_blank的。现在发现Writer还是很不错的了,原来是可以设定格式的,也可以直接编辑html,而且可以Web预览,链接还可以加入到链接词汇表,挺方便的。
create
table
t(
id
uniqueidentifier
not
null
default(
newid()))
--guid不会重复,36位字符+字母+数字
--全数字
create
table
t(
id
char(10)
not
null
default(
right('0000000000'+rtrim(abs(checksum(newid())))+rtrim(abs(checksum(newid()))),16)))
1 用select count()得到总记录条数t;
2 用分页查找,用随机数Random得到一个0<x<t的x数,然后分页的分页数和分页量都用x
3该分页查找得到的就是一个随机的记录。
4循环1-3步骤,直到得到希望数量的随机记录。
Oracle的随机数产生函数(DBMS_RANDOM )
2007-10-17 17:12
Oracle8 80版介绍了DBMS_RANDOM包,Oracle8i 816版介绍了DBMS_RANDOM包的新功能,但Oracle8i 文档中没有详细全面介绍其功能。幸运的是:有一个新的DBMS_RANDOM包函数能够返回0-1之间的随机数。这个新函数是:
◆ FUNCTION value RETURN NUMBER;
◆ FUNCTION value (low IN NUMBER, high IN NUMBER) RETURN NUMBER;
◆ FUNCTION normal RETURN NUMBER;
◆ FUNCTION string (opt char, len NUMBER) RETURN VARCHAR2;
VALUE函数的第一种形式返回一个大于或等于0且小于1的随机数;第二种形式返回一个大于或等于LOW,小于HIGH的随机数。下面是其用法的一个示例:
SQL> select dbms_randomvalue, dbms_randomvalue(55,100) from dual;
VALUE DBMS_RANDOMVALUE(55,100)
--------------- -----------------------------
782821936 796367038
NORMAL函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。事实上,这就是你在清单1中所看到的。
最后,是STRING函数。它返回一个长度达60个字符的随机字符串。参数OPT可以是清单2显示的值中的任何一个单个字符。
关于这些函数及DBMS_RANDOM包的文件都包含在SQLPlus中:
select text from all_source
where name = 'DBMS_RANDOM'
and type = 'PACKAGE' order by line;
因数据库不同有不同的函数,以oracle为例:常用的有单条语句作用的函数:destinct(去除重复行),to_char(转换自符串),to_date(日期格式函数),sumstr(截取自符串),lower(将字母转换为小写),upper(将字母转换为小写),char(将数字转换为字符),ascii(求字符的ascii码)等函数;
组函数:min(求最小值),max(求最大值),avg(求平均数),sum(求总和),counnt(统计记录数);
至于字符集需要你自己定义,我这里随便写了点字符
public static String getRandomString(int length) { //length表示生成字符串的长度
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = randomnextInt(baselength());
sbappend(basecharAt(number));
}
return sbtoString();
}
可以用Floor与Rand函数嵌套表达式为每行记录生成1-4之间的随机数,然后以该随机数对记录行排序,这样就可将该列数随机分成四组了。当然表的记录行数不能太少,否则无法保证至少有4个组。
请参考下列sql实现语句:
这里假设表名为t1,字段名为num
select t from
(select Floor(4 Rand()+1) as GroupName,
num from t1) t order by tGroupName;
以上就是关于数据库怎么让一列生成随机数全部的内容,包括:数据库怎么让一列生成随机数、谁知道数据库中怎样产生随机数、SQL数据库字段的默认随机值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)