如何从我的数据集 中抽取 50 个随机文件,每个文件在 shell 脚本中具有相同的概率?
How to sample 50 random files from my dataset witch each file having the same probabilty to be taken in shell script?
find /mnt/Dataset/ -type f | shuf -n 50
是否有效?
shuf
是否等待计算所有行然后进行随机选择? shuf
给每一行的概率是一样的吗?或者我应该使用其他工具?
当您想知道shuf
如何与管道一起工作时(等待管道完成或处理数据可用时,您可以编写一个测试。测试将如下所示:
for ((i=0; i<20; i++)); do
(printf "%s\n" {1..9}; sleep 0.1; echo 10) | shuf | tr '\n' ' '
echo
done
此测试没有 -n 选项,您需要更大的样本来查看平均值。下一个循环更适合测试
for ((i=0; i<10000; i++)); do
(printf "%s\n" {1..9}; sleep 0.01; echo 10) | shuf | tr '\n' ' '
echo
done > sample.txt
# Look for how often 10 is the last number on a line
grep -c "10 $" sample.txt
我也做了测试:
cut -d " " -f1 sample.txt | sort | uniq -c
1040 1
985 10
976 2
1012 3
981 4
999 5
1043 6
974 7
979 8
1011 9
我没有检查样本大小的分布,但感觉是一个很好的随机分布。
find /mnt/Dataset/ -type f | shuf -n 50
是否有效?
shuf
是否等待计算所有行然后进行随机选择? shuf
给每一行的概率是一样的吗?或者我应该使用其他工具?
当您想知道shuf
如何与管道一起工作时(等待管道完成或处理数据可用时,您可以编写一个测试。测试将如下所示:
for ((i=0; i<20; i++)); do
(printf "%s\n" {1..9}; sleep 0.1; echo 10) | shuf | tr '\n' ' '
echo
done
此测试没有 -n 选项,您需要更大的样本来查看平均值。下一个循环更适合测试
for ((i=0; i<10000; i++)); do
(printf "%s\n" {1..9}; sleep 0.01; echo 10) | shuf | tr '\n' ' '
echo
done > sample.txt
# Look for how often 10 is the last number on a line
grep -c "10 $" sample.txt
我也做了测试:
cut -d " " -f1 sample.txt | sort | uniq -c
1040 1
985 10
976 2
1012 3
981 4
999 5
1043 6
974 7
979 8
1011 9
我没有检查样本大小的分布,但感觉是一个很好的随机分布。