如何生成總和固定的幾個(有範圍的)隨機數?

時間 2021-06-06 21:07:38

1樓:

你可以看看乙個叫做狄利克雷分布的東西

或者你可以用Beta分布或者Gamma分布生成Dirichlet分布用R語言(http://

cran.r-project.org

)gtools::rdirichlet(m,rep(1,n))*S生成m組像 @符咒的力量 描述的那種隨機數,每組n個,其和為S一般的,用

gtools::rdirichlet(m,rep(q,n))*S生成m組隨機數,每組n個,其和為S

這裡q是乙個引數,越大代表資料越平均(生成的每個資料越接近S/n)而q越小代表資料生成得越不平均(有乙個資料相當大,其他的都相當小)更特殊的,用

gtools::rdirichlet(m,alpha)*S生成m組隨機數,每組隨機數的個數與alpha的長度相等且第i個隨機數的均值為alpha[i]/sum(alpha)*S這個是gtools::rdirichlet函式的演算法function (n, alpha)

可以看出,其實就是生成gamma分布隨機數然後歸一化當然,如果你要求生成的每乙個隨機數都是整數,你可以用rmultinom(n,size,prob)生成

這裡n是生成幾組這樣的隨機數

size是每組隨機數的和

prob是乙個向量,第i個元素代表每組第i個元素佔總體的比例

2樓:

matlab自帶的隨機數就那麼幾種,均勻分布,高斯分布,整數均勻分布,其他的都是根據自己的需要搞出來的。在有均勻分布的x之後根據各個概率函式的概率密度就能生成出不同的資料了。

在matlab裡面生成總和一定的隨機數的一般方法就是在生成均勻的數後進行乙個歸一化,就能解決問題。你這裡既然沒有說要什麼樣的概率密度的那這種方法就夠了。又多了乙個條件是》A && close all;

clear;

clc;

a = 10;

b = 20;

N= 10;

S = 150;

S_abs=S-N*a;

out_abs=randi(b-a,N);

out_abs=out_abs/sum(out_abs)*S_abs;

out_abs = round(out_abs+a);

sum(out_abs)

如何通過固定的引數動態生成類?

Elvin Peng 通過使用 type 可以實現,下面是乙個簡單的例子 coding utf8 deffunc test cls words 第乙個引數為類本身,相當於類中方法的 selfprint words if name main 建立乙個名字為A的類,它有乙個 name 屬性,有乙個 ec...

c語言如何生成隨機不重複的幾個數?

涇渭漳淮 如果你只是想獲得幾個或者幾十個隨機數,那最簡單的辦法就OK,拿個陣列把每次產生的隨機數存一下,然後產生新的隨機數之後查詢一下看看是不是重複了就行。如果你想獲得幾k甚至幾兆的隨機數,那查詢就變成了瓶頸,你需要換乙個查詢的方法,紅黑樹字典樹之類的都可以。如果你想獲得幾百兆甚至幾G個不重複的隨機...

生成固定的位數的01字串有好的演算法嗎?

陳奕霖 按題主的例子生成 20 位的 n 20 head c n 7 8 dev urandom xxd b cut d f 2 7 tr d n head c n 其中的 20 可以可以任意改。 寫一下我的思路 char str new char 21 str 20 0 20 8 32 5 0 0...