工作中遇到需要将一个累计值分摊到若干天只,且不能平均分摊,要有一定的波动,比如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
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
begin
delete from #t;
set @f=0 --如果校验不通过,则重新生成
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
工作中遇到需要将一个累计值分摊到若干天只,且不能平均分摊,要有一定的波动,比如1000,分配到20天中,平均每天是50,但是又不能全是50,需要分配成49,51,52这样。所以就需要生成一组-0.1到+0.1之间的随机数,但是要保证求和等于0,然后去乘平均数,得到每天需要分配的值。那么怎么生成一组-0.1到+0.1之间的随机数,但是要保证求和等于0的数据呢,具体算法如下:生成N-1个 -0
函数(cdf)
生成
随机数
- -mat lab开发
句法y = randdf(S,D,F) S - 维度的大小,整数值。 示例:S=10 创建一个 10×1 数组示例:S=[10,2] 创建一个 10×2 矩阵
D - 密度函数,数字矩阵Pdf 或 cdf 由矩阵描述,其大小为 N×2。 pdf 或 cdf 的采样点形成第二行。 pdf 或 cdf 的函数值形成第一行。
F - 标志,'pdf' 或 'cdf'
例子: x=[-1:0.01:1];%采样点y=2*(x-
0.1
)+4*(x0.3);% pdf的函数值情节(x,y,'黑色') r=randdf([10000],[y;x],'pdf'); %
生成
随机数
坚持,稍等h=直方图(r); h.归一
本文实例讲述了JavaScript返回0-1
之间
随机数
的方法。分享给大家供大家参考。具体如下:
JavaScript的Math对象的random方法可以返回一个0-1
之间
随机数
<!DOCTYPE html>
<p id=demo>
Click the button to display a random number.
<button onclick=myFunction()>Try it</button>
[removed]
function myFunction()
document.getElementById(demo).inne
今天我们来看一个有趣的问题:
不断从[0,1]中随机选择一个数进行累加,直到其和超过1,需要选择几次?
对于一次特定的实验,次数是一个确定的整数。我们要讨论的是,选择次数的数学期望。或者说,平均需要多少次。
现在,这已经变成了一个比较复杂的数学问题了。但是,好在问题描述并不复杂,我们可以用计算机进行数值模拟。
程序流程图:
step1: 设s=0;
step2: 从[0,1]中随机选择一个数x;
step3: s=s+x;
step4: 若s>1,停止.
1.故事背景
生成
一个随机红包,红包的数值
0.1
元-100元不等,其具体概率为:
0.1
元为最小单位,
0.1
元到0.5元的概率为40%,0.5元到1元的概率为50%,1元-2元的概率为5%,2元-3元的概率为3%,3元-4元的概率为1%,4元-5元概率为0.99%,5元-100元的概率为0.01%。
2.思考过程
其实问题很简单,把概率放到一条线段上,我们先把问题简单化,假设随机
生成
0的概率...
原理见课本(Simulation Simulation Sheldon M.Ross 5th Edition)39页 3.1
R语言代码
# 此脚本为:产生服从0-1均匀分布的
随机数
并绘制图像
# 共绘制十二幅图,每幅图使用不同的种子(初始值),即12组不同的
随机数
rm(list = ls()) # 清空变量
dev.off # 清空绘图区域
par(mfrow = c(3,4), ann = FALSE) # 将绘图区域分割为12块
seed <- se