sch*_*ity 4 bash random numeric-data
这个问题是关于在一个范围内生成随机数,这很好,但不适合我的情况。
\n我将用 SQL 术语进行解释,因为在我看来,这更容易理解,尽管问题是关于bash
. 我的想法是用代码的结果bash
构建一个SQL脚本。
我有两张 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我更喜欢在 中执行此操作bash
,但我对不涉及它的其他解决方案持开放态度。
如果您只想使用常用工具(至少在 Linux 发行版上)来执行此操作,最有效的方法可能是询问shuf
:
shuf -i 1-139 -n 1519 -r\n
Run Code Online (Sandbox Code Playgroud)\n这会产生 1519 个在 1 到 139 之间随机选择的数字。
\n为保证每个地方都有一个人,先将139个数字洗乱,不要重复:
\nshuf -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
假设表中存储了人员person
,并且每个人员都有一个place_id
1 到 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
。
归档时间: |
|
查看次数: |
942 次 |
最近记录: |