回答
剛拿到3個隨機數字,然後計算係數爲1/[您的數之和。最後用這個因子乘以每個隨機數。的總和將是1。
這是迄今爲止公佈的3種方法中最明顯的一致;達人的*可能*是統一的,但我不得不考慮;這個*明顯*統一。但是,您可能會遇到四捨五入的問題 – 2011-04-06 09:03:16
+1:很好的解決方案! – 2011-04-06 09:04:12
+1:我喜歡你的解決方案! – 2011-04-06 09:06:36
由3. 第三生成0和1 鴻溝那些每個之間的兩個隨機數是1和差值兩個隨機三分之二:
void Main()
{
Random r = new Random();
double d1 = r.NextDouble()/3.0;
double d2 = r.NextDouble()/3.0;
double d3 = 1.0 - d1 - d2;
System.Console.WriteLine(d1);
System.Console.WriteLine(d2);
System.Console.WriteLine(d3);
System.Console.WriteLine(d1 + d2 + d3);
}
這個輸出在LINQPad以下內容:
0.0514050276878934
0.156857372489847
0.79173759982226
1
它不會被均勻分佈。第三個數字大於其他數字。 – turbanoff 2012-04-06 10:14:04
UPDATE
- 創建3張隨機數
- 的的Vector3規範化矢量
@馬克:沒錯,我會更新到另一個答案。但總數必須是1,所以這是我的第一個想法。 – Marnix 2011-04-06 09:03:38
和西門子的解決方案一樣,不是嗎? – 2011-07-20 18:47:12
我不確定這是否正確。如果我正確地記住了我的數學,一個1級的向量不一定有它的分量總和。 – BradleyDotNET 2014-09-05 01:14:11
上馬尼克斯」答案輕微變化:
- 生成從[0,1]
- 的隨機數生成
a
兩個隨機數。x
從[0,A]和從y
並[a,1] - 集結果
x
,y-x
,1-y
這實際上是一個棘手的問題。首先:
達人的解決方案是不統一的,因爲它不支持有兩個數字> 1/3。
西門子的解決方案是不均勻的假設「選擇一個隨機數」從均勻分佈中提取,但這有點微妙。它至少在變量之間是對稱的(即[a,b,c]的概率與任何變量的概率相同),但它非常支持更接近於(1/3,1/3,1/3)。通過查看極端情況,以這種方式考慮: (1/3,1/3,1/3)可能來自任何(a,a,a),其範圍從0到1. (1, 0,0),一個同樣有效的三元組,必須來自(1,0,0)。
一個解決方案:在三空間中加上1的正數形成一個等邊三角形,座標爲(1,0,0),(0,1,0),(0,0, 1)。將其延伸至平行四邊形 - 例如通過添加點(1,1,-1)作爲第四點。這個double區域 - 將第二個區域映射到第一個區域,以便在此平行四邊形中選取一個隨機點就足夠了。
平行四邊形可以通過(0,0,1)+ A(1,0,-1)+ B(0,1,-1)均勻採樣,其中A和B的範圍均勻從0到1。
-A
關於西門子的解決方案,你說*「(1,0,0),一個同等有效的三元組必須來自(1,0,0)」 * ..我會說這是錯誤的:任何(a,0,0)'* a *(0,1)中的*(a,0,0)都會生成(1,0,0) – 2011-07-20 18:43:47
好的結果,那是不正確的!一個更好的解釋: 想象一下立方體[0,1]^3;我們對這個立方體進行均勻採樣,然後歸一化爲1的有效歸一化點的三角形區域(x + y + z = 1; x, y,z> = 0)是[0,1]^3立方體中某些點集的歸一化後圖像 - 即立方體中的所有點也位於將原點連接到此點的直線上(1/3,1/3,1/3)是立方體對角線(len rt(3)),而通過(1,0,0)有len 1,所以前者的可能性是rt(3)倍 – 2011-12-09 23:24:55
有一個簡單的方法來做到這一點,但你需要能夠產生均勻的隨機數。
設X在(0,2/3)上是均勻的。如果X < 1/3,則設Y = X + 1/3。否則讓Y = X - 1/3。令Z = 1 - X - Y
在此設置下,X,Y和Z將總計爲1,它們將具有相同的均勻(0,2/3)邊緣分佈,並且所有三個成對相關將是 - (1/2)。
2/2方法:
- 創建的隨機數爲0〜1的列表;縮放到總
- 排序列表,從小到大
- 通過測量每個元件之間的空間,在 第一列表
- 回合在新列表中的每個元素創建一個新的列表
- 更換到帳戶第一要素浮點
對不起,我不知道C#這是它看起來像蟒蛇:
import random
import time
PARTS = 5
TOTAL = 10
PLACES = 3
def random_sum_split(parts, total, places):
a = [0.0, total]
for i in range(parts-1):
a.append(random.random()*total)
a.sort()
b = []
for i in range(1,(parts+1)):
b.append(a[i] - a[i-1])
if places != None:
b = [round(x, places) for x in b]
c = b[-(parts-1):]
d = total - sum(c)
if places != None:
d = round(d, places)
c.insert(0, d)
log(a)
log(b)
log(c)
log(d)
return c
def tick():
if info.tick == 1:
start = time.time()
alpha = random_sum_split(PARTS, TOTAL, PLACES)
log('********************')
log('***** RESULTS ******')
log('alpha: %s' % alpha)
log('total: %.7f' % sum(alpha))
log('parts: %s' % PARTS)
log('places: %s' % PLACES)
end = time.time()
log('elapsed: %.7f' % (end-start))
個
收率:
Waiting...
Saved successfully.
[2014-06-13 00:01:00] [0.0, 1.3005056784596913, 3.0412441135728474, 5.218388755020509, 7.156425483589107, 10]
[2014-06-13 00:01:00] [1.301, 1.741, 2.177, 1.938, 2.844]
[2014-06-13 00:01:00] [1.3, 1.741, 2.177, 1.938, 2.844]
[2014-06-13 00:01:00] 1.3
[2014-06-13 00:01:00] ********************
[2014-06-13 00:01:00] ***** RESULTS ******
[2014-06-13 00:01:00] alpha: [1.3, 1.741, 2.177, 1.938, 2.844]
[2014-06-13 00:01:00] total: 10.0000000
[2014-06-13 00:01:00] parts: 5
[2014-06-13 00:01:00] places: 3
[2014-06-13 00:01:00] elapsed: 0.0036860
在這個確切的問題上與其他評論相同。這個問題被標記爲C#,請用問題的語言回答。 – BradleyDotNET 2014-09-05 01:18:33
抱歉,從python線程重定向。理論依然存在;顯示了兩種替代解決方案。我不知道C#,但我會編輯/發佈一個通用算法,以幫助移植。 – litepresence 2014-09-05 01:21:37
它可以更好地格式化,我不認爲我可以親自執行這裏的信息轉換,但我很欣賞這種努力。我會刪除我的downvotes。 – BradleyDotNET 2014-09-05 01:29:55
1/2方法:
- 創建的隨機數的列表,長度部分,每個部分爲0〜1。
- 總和列表
- 將每個元素的總和
- 回合每個元素
- 賬戶浮點運算,通過編輯的第一要素
對不起不知道C#,這裏的蟒蛇:
import random
import time
PARTS = 5
TOTAL = 10
PLACES = 3
def random_sum_split(parts, total, places):
a = []
for n in range(parts):
a.append(random.random())
b = sum(a)
c = [x/b for x in a]
d = sum(c)
e = c
if places != None:
e = [round(x*total, places) for x in c]
f = e[-(parts-1):]
g = total - sum(f)
if places != None:
g = round(g, places)
f.insert(0, g)
log(a)
log(b)
log(c)
log(d)
log(e)
log(f)
log(g)
return f
def tick():
if info.tick == 1:
start = time.time()
alpha = random_sum_split(PARTS, TOTAL, PLACES)
log('********************')
log('***** RESULTS ******')
log('alpha: %s' % alpha)
log('total: %.7f' % sum(alpha))
log('parts: %s' % PARTS)
log('places: %s' % PLACES)
end = time.time()
log('elapsed: %.7f' % (end-start))
yeilds:
Waiting...
Saved successfully.
[2014-06-13 00:01:00] [0.33561018369775897, 0.4904215932650632, 0.20264927800402832, 0.118862130636748, 0.03107818050878819]
[2014-06-13 00:01:00] 1.17862136611
[2014-06-13 00:01:00] [0.28474809073311597, 0.41609766067850096, 0.17193755673414868, 0.10084844382959707, 0.02636824802463724]
[2014-06-13 00:01:00] 1.0
[2014-06-13 00:01:00] [2.847, 4.161, 1.719, 1.008, 0.264]
[2014-06-13 00:01:00] [2.848, 4.161, 1.719, 1.008, 0.264]
[2014-06-13 00:01:00] 2.848
[2014-06-13 00:01:00] ********************
[2014-06-13 00:01:00] ***** RESULTS ******
[2014-06-13 00:01:00] alpha: [2.848, 4.161, 1.719, 1.008, 0.264]
[2014-06-13 00:01:00] total: 10.0000000
[2014-06-13 00:01:00] parts: 5
[2014-06-13 00:01:00] places: 3
[2014-06-13 00:01:00] elapsed: 0.0054131
這不是C#。請注意在問題上使用的標籤。 – BradleyDotNET 2014-09-05 01:17:12
- 1. MATLAB:如何生成2個總和小於1的隨機數?
- 2. 生成3個總和爲1的隨機數R
- 3. 生成N個隨機數,其總和爲常數K - Excel
- 4. 隨機數總是產生1數個
- 5. 如何生成總和爲預定值的N個隨機值?
- 6. C++生成隨機數-1
- 7. 生成隨機數1-100
- 8. 如何用兩個總和生成一組隨機數
- 9. 隨機數生成與它爲1
- 10. 如何生成10個隨機數,範圍爲1到100?
- 11. 如何生成-1和1之間的隨機數?
- 12. 如何在C中生成-1和1之間的隨機數?
- 13. 生成總計爲1的隨機數字列表
- 14. 生成總和爲常數的隨機數
- 15. 如何比數組中的其他隨機數生成一個隨機數?
- 16. PC/Mac如何爲0或1生成隨機數?
- 17. 生成隨機值1/X
- 18. 如何生成一個隨機數
- 19. 生成m等分數字,其總和爲1在R
- 20. LINQ - 生成一組隨機整數,其總和落在一個範圍內
- 21. 如何創建三個總和爲特定值的隨機整數? (Python)
- 22. 生成多個隨機數
- 23. 爲HTML生成一個隨機數
- 24. 如何在Haskell中隨機生成一個隨機生成的數字列表
- 25. 你如何生成一個只有-1和1的隨機序列?
- 26. 在隨機生成50個隨機數中使用隨機數#
- 27. 如何生成像素值爲1-12的隨機位置?
- 28. C++爲psudo隨機數生成器生成一個很好的隨機種子
- 29. 總和隨機數
- 30. 生成幾何隨機數
你自己試過這個嗎?問題是什麼?你可以發佈一些代碼嗎? – 2011-04-06 09:01:06
這三個數字不能從均勻分佈中得出,因爲它意味着樣本間的獨立性,而您對這些值有明確的約束('x + y + z = 1')。 – 2011-04-06 09:03:27
爲什麼?這是功課嗎? – 2011-04-07 08:26:46