Bash

連結在一起的兩個範圍之間的隨機數輸出

  • November 12, 2021

這個問題是關於在一個範圍之間生成隨機數,這很好,但它不適合我的情況。

我將用 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

引用自:https://unix.stackexchange.com/questions/677038