Bash
連結在一起的兩個範圍之間的隨機數輸出
這個問題是關於在一個範圍之間生成隨機數,這很好,但它不適合我的情況。
我將用 SQL 術語進行解釋,因為在我看來這更容易理解,儘管問題是關於
bash
. 我的想法是用bash
程式碼的結果建構一個 SQL 腳本。我有兩張 MySQL 表,一張是人,一張是地方。每條記錄都有一個唯一的整數 id,從 1 到 139(地點)和 1 到 1519(人)。它們通過外鍵相互連結,意思是:一個地方可以有很多人,但一個人只能有一個地方。
# 1-139 # 1-1519 place1 → person1 → person2 → person3 ... and so on
我現在擁有的數據是,在一個地方所有的人都聯繫在一起,而其他地方沒有任何联系。
名額是139,人是1519,所以我有一個地方1519人。
我的目標是將人員隨機分配到各個地方,並且每個地方至少有一個人。
到目前為止,我的程式碼是這樣的:
$ c=1519 $ while [[ $c -ne 0 ]]; do x=$((shuf -i 1-139 -n 1)) [[ $x -gt 139 ]] && continue echo $x (( c-- )) done
此程式碼生成 1-139 之間的 1519 個隨機數,因此現在我可以將每個人連結到一個隨機位置。
我的問題是:
- 有沒有更有效的方法來實現這一點?
- 如何控制每個地方至少有一個人?
我更喜歡在 中執行此操作
bash
,但我對其他不涉及它的解決方案持開放態度。
如果您只想使用常用工具(至少在 Linux 發行版上)執行此操作,最有效的方法可能是詢問
shuf
:shuf -i 1-139 -n 1519 -r
這會產生 1519 個在 1 到 139 之間隨機選擇的數字。
為確保每個地方都有一個人,先洗139個號碼,不要重複:
shuf -i 1-139 shuf -i 1-139 -n 1380 -r
為了減少“前 139”效應(前 139 人最終會在不同的地方),再次洗牌:
(shuf -i 1-139; shuf -i 1-139 -n 1380 -r) | shuf