工作中遇到需要將乙個累計值分攤到若干天只,且不能平均分攤,要有一定的波動,比如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 --如果校驗不通過,則重新生成
endend
生成10000條,大概需要35秒左右時間,效能還算能接受。
一下是python的實現**
from random import random
randlist=
n=10000
while 1:
for i in range(n-1):
randlist_sum=sum(randlist)
last_rand=-randlist_sum
if last_rand>-0.1 and last_rand<0.1:
print('last_rand:',last_rand)
break
else:
randlist=
#print('重新生成')
另外,在網上搜尋到一篇用腦excel生成的文章,連線如下
C 庫研究筆記 生成一組隨機數
當試圖用 srand time 0 rand 生成一組隨機數時發現,生成的數字很多都是 一樣 的 經過測試 srand seed rand 生成隨機數,當seed一樣時,生成的隨機數相同。所以上述 一樣 的問題應該出在time 0 所以最後採用的方式是 sleep 高精度計時,srand getti...
Python 生成一組隨機數列表
一.最直接的方式 用numpy.random模組來生成隨機數組 1 np.random.rand 用於生成 0.0,1.0 之間的隨機浮點數,當沒有引數時,返回乙個隨機浮點數,當有乙個引數時,返回該引數長度大小的一維隨機浮點數陣列,引數建議是整數型,因為未來版本的numpy可能不支援非整形引數。im...
Python 生成一組隨機數列表(有放回)
一.最直接的方式 用numpy.random模組來生成隨機數組 1 np.random.rand 用於生成 0.0,1.0 之間的隨機浮點數,當沒有引數時,返回乙個隨機浮點數,當有乙個引數時,返回該引數長度大小的一維隨機浮點數陣列,引數建議是整數型,因為未來版本的numpy可能不支援非整形引數。im...