加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

生成一组-0.1到0.1之间的随机数,且总和为0

发布时间:2020-12-12 13:28:08 所属栏目:MsSql教程 来源:网络整理
导读:工作中遇到需要将一个累计值分摊到若干天只,且不能平均分摊,要有一定的波动,比如1000,分配到20天中,平均每天是50,但是又不能全是50,需要分配成49,51,52这样。所以就需要生成一组-0.1到+0.1之间的随机数,但是要保证求和等于0,然后去乘平均数,得到每

工作中遇到需要将一个累计值分摊到若干天只,且不能平均分摊,要有一定的波动,比如1000,分配到20天中,平均每天是50,但是又不能全是50,需要分配成49,51,52这样。所以就需要生成一组-0.1到+0.1之间的随机数,但是要保证求和等于0,然后去乘平均数,得到每天需要分配的值。
那么怎么生成一组-0.1到+0.1之间的随机数,但是要保证求和等于0的数据呢,具体算法如下:
生成N-1个 -0.1到0.1的随机数,然后第N个值为0减去前面N-1个数的和,如果第N个值也在-0.1到0.1,就完成,然后不在这个范围,又重新生成一遍,直到成功为止。
下面是用T-sql实现的代码

create table #t(a numeric(8,7))
declare @i int,@last_num  numeric(8,7),@f int
set @f=0
while @f=0
begin
	set @i=1 
	while @i<10000   --产生的随机数数量
	begin
		insert  into #t(a) values(rand()*0.2-0.1 )  --随机数的范围
		set @i=@i+1
	end;
	set @last_num=0-(select SUM(a) from #t);     ---生成最后一个随机数
	if abs(@last_num )<0.1							--校验最后一个随机数
	begin
		insert  into #t(a) values(@last_num)         --如果通过校验,则将随后一个数插入临时表,并查询出结果集
		select * from #t;
	drop table  #t;
	set @f=1
	end 
	else
		begin
		delete from #t; 						
		set @f=0								--如果校验不通过,则重新生成
	end
end
生成10000条,大概需要35秒左右时间,性能还算能接受。



一下是python的实现代码

from  random import random


RandList=[]
n=10000
while 1:
    for i in range(n-1):
        RandList.append(random()*0.2-0.1)
    RandList_Sum=sum(RandList)
    Last_Rand=-RandList_Sum
    if Last_Rand>-0.1 and Last_Rand<0.1:
        print('Last_Rand:',Last_Rand)
        RandList.append(Last_Rand)
        break
    else:
        RandList=[]
        #print('重新生成')
另外,在网上搜索到一篇用脑excel生成的文章,连接如下 http://www.excel123.cn/Article/excelhanshu/201312/1035.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读