有没生成随机数的方便方法?

xuejiecn 2009-09-15 02:37:21
一个select查询,如何取到不同的随机数。
select rand(),* from tb
得到的值是同一个。
MSSQL中有没有方便的方法?
...全文
224 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
soft_wsx 2009-09-15
  • 打赏
  • 举报
回复
再提供
create view v_RAND
as
select re=stuff(rand(),1,2,'')
go

alter function f_RANDBH()
returns varchar(50)
as
begin
declare @bhlen int
set @bhlen=18 --长度
declare @r varchar(50)
if not(isnull(@BHLen,0) between 1 and 50)
set @BHLen=10
lb_bh:
select @r=re from v_RAND
while len(@r)<@BHLen
select @r=@r+re from v_RAND
set @r=left(@r,@BHLen)


if exists(select * from tb with(xlock,paglock) where bh=@r)
goto lb_bh

return(@r)
end
go
select dbo.f_RANDBH(50) --位数自定,最长50 --28717932268756598246257824810881924833466287969484

if OBJECT_ID('tb') is not null drop table tb
CREATE TABLE tb(
BH varchar(50) PRIMARY KEY DEFAULT dbo.f_RANDBH(),
col int)

insert tb(col) select '1'
union all select '2'
union all select '3'
union all select '4'

select * from tb

/*
BH col
05687060012621147682667991318240430642346925752116 2
40513682887835085371622114346506827930698368827862 4
93225207611122374334349586587204091830009171524409 3
99914455216184595182213501939577680323090326328828 1
*/
xuejiecn 2009-09-15
  • 打赏
  • 举报
回复
谢谢了,最后是JJ的方案。感觉上可能会好一些。
sgtzzc 2009-09-15
  • 打赏
  • 举报
回复
也可以用临时表

select *,sno=identity(int,1,1) into # from tb order by newid()

select * from # order by sno

drop table #
sgtzzc 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 xuejiecn 的回复:]
引用 25 楼 fredrickhu 的回复:
引用 19 楼 xuejiecn 的回复:
1、指定数值内的随机数
2。指定数值内的整数

SQL code
生成1-8范围内的随机数:select  (rand()*8+1)

8.74110826715274
因为rand返回的是float,所以计算值不是整数了。

当然还要是可以在查询中用的,不同行的值不一样的了。呵呵

努力下,看有没效率高些的方法。

[/Quote]
随机为每一行加个行号?

select
sno=(select count(1)+1 from (select *,newid() as tid from tb) t2 where tid<t1.tid),
col1,col2,...,coln
from
(select *,newid() as tid from tb) t1
order by sno


这效率貌似不高
华夏小卒 2009-09-15
  • 打赏
  • 举报
回复
我来个笨方法

select number from master..spt_values
where type='p' and number between 0 and 100
order by newid()
number
-----------
67
33
28
21
55
8
50
69
72
68
23
43
61
35
60
90
31
19
54
62
83
47
16
92
75
73
80
42
18
34
22
5
41
89
96
26
58
70
32
66
24
86
0
81
78
51
46
49
27
38
36
84
40
91
25
44
17
56
29
95
9
37
13
77
2
48
39
14
88
45
64
30
85
4
1
59
6
97
52
15
11
76
98
3
53
74
94
82
71
100
10
20
7
65
99
57
79
93
12
63
87

(101 行受影响)
--小F-- 2009-09-15
  • 打赏
  • 举报
回复
 1-1000
select cast((rand()*999+1) as int)
/*-----------
842

(1 行受影响)
*/
SQL77 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 xuejiecn 的回复:]
引用 25 楼 fredrickhu 的回复:
引用 19 楼 xuejiecn 的回复:
1、指定数值内的随机数
2。指定数值内的整数

SQL code
生成1-8范围内的随机数:select  (rand()*8+1)

8.74110826715274
因为rand返回的是float,所以计算值不是整数了。

当然还要是可以在查询中用的,不同行的值不一样的了。呵呵

努力下,看有没效率高些的方法。

[/Quote]
SELECT CEILING(RAND()*100/10)
这是1到10的随机整数
虫洞 2009-09-15
  • 打赏
  • 举报
回复
NEWID 对每台计算机返回的值各不相同。所显示的数字仅起解释说明的作用。   

  随机函数:rand()

  在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数。那就看下面的两种随机取整数的方法:   

  1、

  A:select floor(rand()*N) ---生成的数是这样的:12.0

  B:select cast( floor(rand()*N) as int) ---生成的数是这样的:12   

  2、

  A:select ceiling(rand() * N) ---生成的数是这样的:12.0

  B:select cast(ceiling(rand() * N) as int) ---生成的数是这样的:12   

  其中里面的N是一个你指定的整数,如100,可以看出,两种方法的A方法是带有.0这个的小数的,而B方法就是真正的整数了。
jinjazz 2009-09-15
  • 打赏
  • 举报
回复
1000以内的

select rid=abs(checksum(newid()))%1000 from sysobjects
guguda2008 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 xuejiecn 的回复:]
引用 25 楼 fredrickhu 的回复:
引用 19 楼 xuejiecn 的回复:
1、指定数值内的随机数
2。指定数值内的整数

SQL code
生成1-8范围内的随机数:select  (rand()*8+1)

8.74110826715274
因为rand返回的是float,所以计算值不是整数了。

当然还要是可以在查询中用的,不同行的值不一样的了。呵呵

努力下,看有没效率高些的方法。

[/Quote]
我24L写的就是返回整数的
xuejiecn 2009-09-15
  • 打赏
  • 举报
回复
主要需求是这样的,想生成一个本年随机的日期,准确到小时 即可。
然后里面的数量和金额,乘以一个随机数,有大有小。
xuejiecn 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 fredrickhu 的回复:]
引用 19 楼 xuejiecn 的回复:
1、指定数值内的随机数
2。指定数值内的整数

SQL code
生成1-8范围内的随机数:select (rand()*8+1)
[/Quote]
8.74110826715274
因为rand返回的是float,所以计算值不是整数了。

当然还要是可以在查询中用的,不同行的值不一样的了。呵呵

努力下,看有没效率高些的方法。
--小F-- 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 xuejiecn 的回复:]
1、指定数值内的随机数
2。指定数值内的整数
[/Quote]

生成1-8范围内的随机数:
select (rand()*8+1)
guguda2008 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 xuejiecn 的回复:]
1、指定数值内的随机数
2。指定数值内的整数
[/Quote]
DECLARE @BNUM INT,@ENUM INT
SELECT @BNUM=3,@ENUM=5
SELECT ABS(CHECKSUM(NEWID()))%(@ENUM-@BNUM+1)+@BNUM
xuejiecn 2009-09-15
  • 打赏
  • 举报
回复
人多,把分加满!
xuejiecn 2009-09-15
  • 打赏
  • 举报
回复
1、select rand(checksum(newid()))*@number
2、select cast(round(rand(checksum(newid()))*@number,0) as varchar)
好象有点长,有没简单些的方法?
billpu 2009-09-15
  • 打赏
  • 举报
回复
select RAND(CHECKSUM(NEWID())) from tb --0-1
select (RAND(CHECKSUM(NEWID())))*66 from tb --0-66
select (RAND(CHECKSUM(NEWID())))*100 from tb --0-100
loworth 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xuejiecn 的回复:]
有没有把A。。F 和- 一起替换掉的函数呢?
[/Quote]
SELECT CAST(NEWID() AS VARBINARY)*1
xuejiecn 2009-09-15
  • 打赏
  • 举报
回复
1、指定数值内的随机数
2。指定数值内的整数
xuejiecn 2009-09-15
  • 打赏
  • 举报
回复
指定一个值,生成0-1内 的随机数,或1-100内的,0-66内 的随机数和随机整数
怎么算方便,速度能快些?

加载更多回复(17)
基于32位的C++代码随机数生成器 说明: c++/c标准库/中定义了随机数生成函数 int rand(void):每次调用返回【0,RAND_MAX】之间的整数; void srand(unsigned seed):设置随机数种子 库函数当然有高效,易用等优点,但是rand()使用的是【0,2^16-1】16位线性同于算法,周期比较短(2^16),如果随机数周期要求不高 rand()还是很不错的。要在32位机上产生质量和周期比较好的随机数,例如进行蒙特卡罗模拟,需用Schrage算法。 本代码主要将常用的几种随机数算法以C++语言封装,例如线性同于法,Fabbona数列法,在保证效率的前提下,方便调用,并且留有一定的可扩展性。 这是第二次写的代码,相比之前: 基本重组组了以前的代码 ,与以前很不一样。 1.添加几种生成方法。并引入1,2,3模式,可以在易用和速度上选择合适的方法。 2.各种方法之间使用了更清晰的继承关系,使之具有更好的可扩展性。 3.去掉了以前参数的全局设定,使每一个生成器具有独立的内置参数。 4.采用新的重载运算符方法方便调用。 object() 生成0-1的浮点随机数 object(x) 生成0-x的浮点随机数 object[n] 随机生成0,1,2,3..........,n-1 之间整数。 注意程序还是基于32位的。 其他具体细节也不想写了,源代码里有些说明,并且有一个示例文件。程序并有很严格的检查,里面也会有写问题,使用时要注意。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧