生成一組 0 1到0 1之間的隨機數,且總和為0

2021-07-14 09:52:21 字數 1462 閱讀 8880

工作中遇到需要將乙個累計值分攤到若干天只,且不能平均分攤,要有一定的波動,比如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...