相关文章推荐
谦逊的毛豆  ·  random_shuffle函数-CSDN博客·  1 周前    · 
火星上的火腿肠  ·  MySQL8.0.19 ...·  5 天前    · 
路过的茴香  ·  ICASSP ...·  1 年前    · 
聪明的作业本  ·  Microsoft Visual C++ ...·  1 年前    · 

工作中遇到需要将一个累计值分摊到若干天只,且不能平均分摊,要有一定的波动,比如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
在Unity中可以使用Random.Range()函数 生成 一个从 0.1 到1 0.1 随机数 ,示例代码如下: float randomNumber = Random.Range( 0.1 f, 1 0.1 f); 请注意,在这种情况下, 随机数 的取值范围是左闭右开区间,即实际 生成 随机数 可能为 0.1 ~ 10.0 之间 wl10220708: jaydebeapi-1.2.3 版本,支持连接时传入多个jar包路径,所以不必修改源码即可解决,部分代码如下: jars_list = ['mysql-connector-java-8.0.17.jar', 'ojdbc8.jar'] conn = jaydebeapi.connect(jclassname=driver, url=url, driver_args=[user, password], jars=jars_list) python之DataFrame写excel合并单元格 m0_61126667: 大佬牛牛牛,特别是for循环嵌套那块,整个逻辑非常棒。 稍有觉得可以更正的地方是第2个图,第2条,应该是CN>1该分组有需要合并的单元格。 使用jaydebeapi同时连接两个不同数据库(oracle+mysql)的问题 chenxiaohui12345: 不必这样做,应该是在jpype startjvm时,构建jar list,一次性建立java环境。 list_jar=[] for rec_jdbc in list(set(list_jdbc)): list_jar=list_jar+glob.glob(Path(jdbc_path,rec_jdbc,'*.jar').as_posix()) logger.debug('jdbc jars:{}',os.pathsep.join([Path(s).as_posix() for s in list_jar])) if not jpype.isJVMStarted(): jvmPath = jpype.getDefaultJVMPath() _jvmArgs = java_opts.split(" ") _jvmArgs.append('-Djava.class.path='+os.pathsep.join([Path(s).as_posix() for s in list_jar])) print(*_jvmArgs) jpype.startJVM(jvmPath,*_jvmArgs,ignoreUnrecognized=True,convertStrings=True) if not jpype.java.lang.Thread.isAttached(): print('-----attaching jvm-----') jpype.attachThreadToJVM() python之DataFrame写excel合并单元格 广大菜鸟: self_copy.groupby(key_cols, as_index=False).rank(method='first') 这个还是报错:TypeError: 'NoneType' object is not callable