生成一组-0.1到0.1之间的随机数,且总和为0
2016-07-04 20:31
281 查看
工作中遇到需要将一个累计值分摊到若干天只,且不能平均分摊,要有一定的波动,比如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实现的代码
一下是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
那么怎么生成一组-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
相关文章推荐
- 关于mysql函数GROUP_CONCAT
- windows下mysql忘记root密码的解决办法
- 在mysql Navicat中怎样设置ID自动递增
- CentOS 7运维管理笔记(10)----MySQL源码安装
- 关于mysql外键约束不成功的笔记
- mysql 设置字段为null
- 关于mysql中外键约束对父表的含义
- Redis 和 Memcached 的区别
- NoSQL之Redis---集群教程
- mysql数据库登录及用户管理
- 开源MySQL数据仓库解决方案:Infobright
- oracle 11g数据库的基础概念
- SQL中Group By的使用
- mysql导出数据命令,mysqldump用法
- windows下mysql5.7.13msi安装及绿色版安装方法
- Nginx1.11+Redis3+Tomcat7服务器搭建
- mssql查询表&过程等
- mysql数据库优化小结
- Hadoop Hive基础sql语法
- mysql各种查询