链接在一起的两个范围之间的随机数输出

sch*_*ity 4 bash random numeric-data

这个问题是关于在一个范围内生成随机数,这很好,但不适合我的情况。

\n

我将用 SQL 术语进行解释,因为在我看来,这更容易理解,尽管问题是关于bash. 我的想法是用代码的结果bash构建一个SQL脚本。

\n

我有两张 MySQL 表,一张是people,一张是places。每条记录都有一个唯一的整数 ID,范围为 1 到 139(地点)和 1 到 1519(人)。它们通过外键相互联系,意思是:一个地方可以有很多人,但一个人只能有一个地方。

\n
# 1-139  # 1-1519\nplace1 \xe2\x86\x92 person1\n       \xe2\x86\x92 person2\n       \xe2\x86\x92 person3\n       ... and so on\n
Run Code Online (Sandbox Code Playgroud)\n

我现在掌握的数据是,在一个地方所有的人都有联系,而其他地方没有任何联系。

\n

名额有139个,人数有1519人,所以我有1个名额,有1519人。

\n

我的目标是将人员随机分配到各个地方,并且每个地方至少有一个人。

\n

到目前为止我的代码是这样的:

\n
$ c=1519\n$ while [[ $c -ne 0 ]]; do \n    x=$((shuf -i 1-139 -n 1))\n    [[ $x -gt 139 ]] && continue\n    echo $x\n    (( c-- ))\n  done\n
Run Code Online (Sandbox Code Playgroud)\n

此代码生成 1-139 之间的 1519 个随机数,因此现在我可以将每个人链接到一个随机位置。

\n

我的问题是:

\n
    \n
  • 有没有更有效的方法来实现这一目标?
  • \n
  • 如何控制每个地方至少有一个人?
  • \n
\n

我更喜欢在 中执行此操作bash,但我对不涉及它的其他解决方案持开放态度。

\n

Ste*_*itt 9

如果您只想使用常用工具(至少在 Linux 发行版上)来执行此操作,最有效的方法可能是询问shuf

\n
shuf -i 1-139 -n 1519 -r\n
Run Code Online (Sandbox Code Playgroud)\n

这会产生 1519 个在 1 到 139 之间随机选择的数字。

\n

为保证每个地方都有一个人,先将139个数字洗乱,不要重复:

\n
shuf -i 1-139\nshuf -i 1-139 -n 1380 -r\n
Run Code Online (Sandbox Code Playgroud)\n

为了减少 \xe2\x80\x9cfirst 139\xe2\x80\x9d 效应(前 139 个人最终都会出现在不同的地方),请再次打乱所有这些:

\n
(shuf -i 1-139; shuf -i 1-139 -n 1380 -r) | shuf\n
Run Code Online (Sandbox Code Playgroud)\n


Kus*_*nda 5

假设表中存储了人员person,并且每个人员都有一个place_id1 到 139 之间的整数。使用 SQL,person直接更新表:

UPDATE person SET place_id = FLOOR(RAND()*139 + 1);
Run Code Online (Sandbox Code Playgroud)

这应该更新表中的每个条目,随机化place_id密钥。但它完全未经测试。

更新后,您可以使用以下方法测试每个地点是否代表

SELECT COUNT(DISTINCT place_id) = 139 FROM person;
Run Code Online (Sandbox Code Playgroud)

如果所有地点都已表示,则应返回1,否则返回0