2013-11-09 57 views
9

第一次在Stackoverflow處。我希望有人能夠幫助我搜索算法。在給定範圍內生成N個隨機數,總和達到給定總和

我需要在給定的範圍內生成N個隨機數,總和爲給定的總和!

例如:Generatare 3數字,總計爲11

範圍:

  1. 價值和3之間。5和3之間和1之間
  2. 價值8.
  3. 值7.

此檢查的生成數字可能是:2,5,4。

我已經搜索了很多,並找不到我需要的解決方案。

有可能產生像N這樣的恆定總和模數: generate random numbers of which the sum is constant 但我不能用範圍來完成。

或者通過生成N個隨機值,將它們相加,然後將常數和除以隨機和,然後將每個隨機數乘以該商as proposed here

主要問題,爲什麼我不能採用這些解決方案是,我的每個隨機值有不同的範圍,我需要的值是與範圍均勻分佈(例如,在min/max沒有頻率發生,如果我切斷小於/大於最小/最大值的值)。

我也想到了一個靈魂,取一個隨機數(在該示例中,值爲1,2或3),生成範圍內的值(在最小值/最大值或最小值和其餘值之間,取決於在哪個更小),減去我給定的數量,並保持這種狀態,直到一切分配。但那將是可怕的無效。我真的可以使用算法的運行時間固定的方式。

我試圖讓它在Java中運行。但是那個信息並不重要,除非有人已經準備好了解決方案。我需要的只是一個算法的描述或想法。

+2

不可能。如果他們符合你的要求,他們並不是真正的隨機。 –

+3

@HotLicks - 我不同意,他們可能是隨機的(拋開我們無法生成隨機數字) - 但是隨機數量的自由度較低。我發現這個說法與「不能在範圍[0,10]中產生一個隨機數 - 因爲限制使得它不可能進行真正的隨機化」。 – amit

+0

@amit - 但是在選擇了前兩個數字後,第三個數字根本就不是隨機的。 –

回答

7

首先,請注意這個問題等同於:

產生k個數字,總計爲一個數y,使得X_1,...,X_K - 每個人都有一個限度。

第二可通過簡單地減小下限從數量來實現 - 所以在你的例子,它是等效於:

生成3個數字,使得X1 < = 2; x2 < = 3; x3 < = 4; X1 + X2 + X3 = 2

需要注意的是第二個問題可以通過多種方式來解決,其中之一是:

生成每個元素​​重複清單 - 其中​​是元素的限制i - 隨機播放列表,並選擇第一個元素。

在你的例子中,列表是:[x1,x1,x2,x2,x2,x3,x3,x3,x3] - 洗牌並選擇前兩個元素。

(*)請注意,可以使用fisher-yates算法完成清單重組。 (您可以在通過期望的限制後中止中間算法)。

+0

正是我需要的,謝謝。仍然必須考慮大K和更大範圍(如數百,例如50-150)和列表 – user2971974

+0

的內存消耗的複雜性,您不一定非得創建列表。如果您只需要幾個樣本,則可以使用虛擬列表,而無需隨機播放。隨機選擇位置,在此基礎上,您可以獲得元素(倒數,跳過標記的元素等)。 –

+0

花了我幾年時間來了解它是如何工作的,但現在我明白了,我很欣賞多麼優雅的解決方案這是 –

6

加起來的最小值。在這種情況下,1 + 5 + 3 = 9

11 - 9 = 2,因此您必須在三個數字之間分配2(例如:+ 2,+ 0,+ 0或+ 0,+ 1,+ 1 )。

我給你留下餘下的餘數,在這個轉換之後創建一個統一的分佈是相對容易的。

+1

這是一種方法,但不是我想要的方式。或者更具體地說,問題本身就是這裏要點的分佈。但是,對不起,它是我的錯(不好的例子或不好的問題描述)。 在具有其他範圍的另一示例中: 1. 1-3 2. 2-20 3. 1-3 並且可以說15的值之和值1和2在大多數情況下將達到其最大值。這不是我想要的。 amits解決方案是我腦海中的東西。這些點需要通過重量分配,具體取決於範圍有多大 – user2971974

2

此問題相當於在3職位上隨機分配超過2的最小值9。所以你從最小值(1/5/3)開始,然後循環2次,產生一個(僞)隨機值[0-2](3位置)並增加索引值。

例如

  • 開始1/5/3
  • 第一隨機= 1 ...增量索引1 ... 1/6/3
  • 第二隨機= 0 ...增量索引0 ... 2/6/3

2 + 6 + 3 = 11

編輯

這個閱讀一第二時間,我明白了,這爲e xactly @KarolyHorvath提到了什麼。

相關問題