随机数

xikboy 2009-11-07 09:11:10
生成指定几个数的和为某个数,

随机出来的数要小一某个数 并且大于某个数,可以为0

如:

N=9 ---合计数

i=4 ---生成笔数
max=3 ----生成数的最大值,超过此数要重新生成
min=1 ----生成数的最小值,小于此数要重新生成

生成出来的数可以是小数

组合可能为:
3 3 3 0
2 2 3 2
1.3 2.6 3 2.1
...全文
150 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ai_li7758521 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xikboy 的回复:]
呵呵~~  这是我自己的,出来了,早上实在急


declare @a  numeric(4,1)
, @j int
, @i INT
, @n numeric(4,1)
, @max numeric(4,1)
, @min numeric(4,1)
, @sum numeric(4,1)
declare @tb table(number numeric(4,1))
set @a=13.2
set @i=23.0
set @max=3
set @min=1

set @sum=0

set @j=1
while @j <@i
begin
set @n=rand()*@max+@min
if len(@sum)=0
set @sum=0

if @a=@sum or @a-@sum <=@max
set @n=0

if (@a-@sum-@n)/@i <=@max and @n <=@max and @sum+@n <@a
begin
insert into @tb select @n
set @i=@i-1
end
select @sum=isnull(sum(number),0) from @tb

end
insert into @tb select @a-@sum

select * from @tb
[/Quote]。
SQL77 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xikboy 的回复:]
呵呵~~  这是我自己的,出来了,早上实在急


declare @a  numeric(4,1)
, @j int
, @i INT
, @n numeric(4,1)
, @max numeric(4,1)
, @min numeric(4,1)
, @sum numeric(4,1)
declare @tb table(number numeric(4,1))
set @a=13.2
set @i=23.0
set @max=3
set @min=1

set @sum=0

set @j=1
while @j <@i
begin
set @n=rand()*@max+@min
if len(@sum)=0
set @sum=0

if @a=@sum or @a-@sum <=@max
set @n=0

if (@a-@sum-@n)/@i <=@max and @n <=@max and @sum+@n <@a
begin
insert into @tb select @n
set @i=@i-1
end
select @sum=isnull(sum(number),0) from @tb

end
insert into @tb select @a-@sum

select * from @tb
[/Quote]
学习
xikboy 2009-11-07
  • 打赏
  • 举报
回复
呵呵~~ 这是我自己的,出来了,早上实在急


declare @a numeric(4,1)
, @j int
, @i INT
, @n numeric(4,1)
, @max numeric(4,1)
, @min numeric(4,1)
, @sum numeric(4,1)
declare @tb table(number numeric(4,1))
set @a=13.2
set @i=23.0
set @max=3
set @min=1

set @sum=0

set @j=1
while @j<@i
begin
set @n=rand()*@max+@min
if len(@sum)=0
set @sum=0

if @a=@sum or @a-@sum<=@max
set @n=0

if (@a-@sum-@n)/@i<=@max and @n<=@max and @sum+@n<@a
begin
insert into @tb select @n
set @i=@i-1
end
select @sum=isnull(sum(number),0) from @tb

end
insert into @tb select @a-@sum

select * from @tb
guguda2008 2009-11-07
  • 打赏
  • 举报
回复
不写动态行转列了
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(
ID INT
,ID2 INT
,VAL NUMERIC(19,2)
)
GO
DECLARE @N NUMERIC(19,6),@I INT,@MAX NUMERIC(19,2),@MIN NUMERIC(19,2),@J INT,@K INT,@ID INT,@ID2 INT
SELECT @N=9,@I=4,@MAX=3,@MIN=1
SELECT @ID=ISNULL(MAX(ID),0)+1,@ID2=1 FROM TB

WHILE @ID2<=@I
BEGIN
IF (SELECT COUNT(VAL) FROM TB WHERE ID=@ID AND ID2=@ID2)<@I-1
BEGIN
DECLARE @TEMP NUMERIC(19,2)
SELECT @TEMP=CONVERT(NUMERIC(19,2),RAND()*(@MAX-@MIN)+@MIN)
IF (SELECT ISNULL(SUM(VAL),0)+@TEMP FROM TB WHERE ID=@ID AND ID2=@ID2)<@N
INSERT INTO TB
SELECT @ID,@ID2,@TEMP
ELSE
INSERT INTO TB
SELECT @ID,@ID2,0
END
ELSE
BEGIN
INSERT INTO TB
SELECT @ID,@ID2,@N-ISNULL(SUM(VAL),0) FROM TB WHERE ID=@ID AND ID2=@ID2
END
SELECT @ID2=@ID2+1
END
SELECT * FROM TB
/*
1 1 2.01
1 2 1.45
1 3 1.63
1 4 1.22
*/
ChinaJiaBing 2009-11-07
  • 打赏
  • 举报
回复

--try

select ceiling(rand()*3)
xiequan2 2009-11-07
  • 打赏
  • 举报
回复
--> 测试数据:[tb] -随机生成指定几个数的和为某个数 
if object_id('[tb]') is not null drop table [tb]
create table [tb]([col] numeric(2,1))
insert [tb]
select 0 union all
select 1 union all
select 1.3 union all
select 2 union all
select 2.1 union all
select 2.6 union all
select 3

--select * from [tb] --tb里面的数为指定的数

declare @n int
set @n=3--sql2005 top 里面参数可以用动态 sql2000用exec

select top(@n) t1col , t2col , t3col , t4col from
(
select t1.col as t1col , t2.col as t2col , t3.col as t3col , t4.col as t4col ,total=t1.col+t2.col+t3.col+t4.col from
(select col from tb) t1,
(select col from tb) t2,
(select col from tb) t3,
(select col from tb) t4

) tmp
where total=9 order by newid()

/*
t1col t2col t3col t4col
--------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
3.0 1.0 3.0 2.0
2.0 2.0 3.0 2.0
3.0 2.0 2.0 2.0


*/




q85958341 2009-11-07
  • 打赏
  • 举报
回复
ACMAIN_CHM 2009-11-07
  • 打赏
  • 举报
回复
先产生前N-1个,然后得出最后一个,如果>MAX则前几个平均加一下。
SQL77 2009-11-07
  • 打赏
  • 举报
回复
SELECT CEILING(RAND()*2+1)
]应该是这样才是1-3
guguda2008 2009-11-07
  • 打赏
  • 举报
回复
一个函数就行了
xikboy 2009-11-07
  • 打赏
  • 举报
回复
那有可能最后一个数 会大于 max
SQL77 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 rucypli 的回复:]
前三个是1-3的随机数  最后一个是9减去前三个的和
[/Quote]
同意,咋没想到呢
SQL77 2009-11-07
  • 打赏
  • 举报
回复
SELECT CEILING(RAND()*1+2)
生成[1-3]的数


你要四个数的和为9麻烦
rucypli 2009-11-07
  • 打赏
  • 举报
回复
前三个是1-3的随机数 最后一个是9减去前三个的和
--小F-- 2009-11-07
  • 打赏
  • 举报
回复
先MRAK 出去踢场球了回来再看看
--小F-- 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xikboy 的回复:]
呵呵~~  这是我自己的,出来了,早上实在急


declare @a  numeric(4,1)
, @j int
, @i INT
, @n numeric(4,1)
, @max numeric(4,1)
, @min numeric(4,1)
, @sum numeric(4,1)
declare @tb table(number numeric(4,1))
set @a=13.2
set @i=23.0
set @max=3
set @min=1

set @sum=0

set @j=1
while @j <@i
begin
set @n=rand()*@max+@min
if len(@sum)=0
set @sum=0

if @a=@sum or @a-@sum <=@max
set @n=0

if (@a-@sum-@n)/@i <=@max and @n <=@max and @sum+@n <@a
begin
insert into @tb select @n
set @i=@i-1
end
select @sum=isnull(sum(number),0) from @tb

end
insert into @tb select @a-@sum

select * from @tb
[/Quote]

不错
叶子 2009-11-07
  • 打赏
  • 举报
回复
将一个正整数随机拆分为三个正整数
http://blog.csdn.net/maco_wang/archive/2009/02/23/3925482.aspx
jnet007 2009-11-07
  • 打赏
  • 举报
回复
随机因子

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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