Linux 生成0和1的随机文件
我想为我的一个项目生成一个大小为2MB的随机文件,该文件在Linux/Windows中只包含0和1。我在Linux中尝试了以下命令:Linux 生成0和1的随机文件,linux,windows,random,binaryfiles,Linux,Windows,Random,Binaryfiles,我想为我的一个项目生成一个大小为2MB的随机文件,该文件在Linux/Windows中只包含0和1。我在Linux中尝试了以下命令: $ time dd if=/dev/urandom of=/dev/null bs=1M count=2 但是Uradom只从内核中获取随机数据,只复制到文件中,这不是我所需要的。有什么想法吗 编辑:所有这些解决方案在实践中都非常糟糕。tripleee的建议将/dev/uradom的输出通过管道传输到perl-0777-ne的“print unpacb*”inq
$ time dd if=/dev/urandom of=/dev/null bs=1M count=2
但是Uradom只从内核中获取随机数据,只复制到文件中,这不是我所需要的。有什么想法吗
编辑:所有这些解决方案在实践中都非常糟糕。tripleee的建议将/dev/uradom的输出通过管道传输到perl-0777-ne的“print unpacb*”inquestions注释中要好得多
你需要快一点的吗?否则,您可以尝试为我花费约2mn:
$ time (for i in `seq 1 $((2*1024*1024))`;
do echo -n $(($RANDOM%2)); done > random.txt)
您可以通过调用$RANDOM less使其更快,例如:
$ time (i=$((2*1024*1024)); a=0; while [ $i -gt 0 ]; do if [ $a -lt 2 ]; then
a=$RANDOM; fi; echo -n "$(($a%2))"; let a=$a/2; let i=$i-1; done > random.txt)
在我的情况下,速度快了近4倍。它所做的是提取数字的正确位,直到数字中不再有1。因此,它可能略微偏向1
然而,如果您想要一个快速的解决方案,您显然不应该使用shell脚本语言。您可以在python中轻松地完成此操作,在我的示例中,这需要约2秒钟:
$ time (python -c "import random; print(''.join('{0}'.format(n) for n in
random.sample([0,1]*16*1024*1024, 2*1024*1024)));" > random.txt)
$ time (python -c "from __future__ import print_function; import random;
[print(random.randint(0,1), end='') for i in range(0, 2*1024*1024)];" > random.txt)
在这里,我随机抽取了一个由0和1组成的大列表。然而,我不确定抽样对随机性质量的影响。如果列表与样本相比是巨大的,我认为它应该提供一个高质量的结果,但是这里它只比样本大8倍,所以它可能有一个可测量的影响
请注意,随机性并不像看上去那么容易。我在这里提出的解决方案的输出并不都具有相同的属性,并且验证它所具有的属性通常是复杂的。您可能想用性能换取“更好”的随机性,在这种情况下,python中的此版本可能会更好—在我的情况下为6秒:
$ time (python -c "import random; print(''.join('{0}'.format(n) for n in
random.sample([0,1]*16*1024*1024, 2*1024*1024)));" > random.txt)
$ time (python -c "from __future__ import print_function; import random;
[print(random.randint(0,1), end='') for i in range(0, 2*1024*1024)];" > random.txt)
在这里,random.randint应该提供一个均匀分布的结果。科林的解决方案非常低效,因为一种方法创建了一个巨大的列表,然后从中进行选择,因此如果您想要一个更大的文件,它将不起作用,而另一种方法每个周期只生成1个字符
$time python3-c随机导入;print.join'{0}'。中n的formatn
随机。样本[0,1]*16*1024*1024,2*1024*1024;>/dev/null
真正的0M4034S
用户0M3856S
系统0M0137S
$time python3-c from _ufuture _u导入打印u函数;随机输入;
[printrandom.randint0,1,end=0,2*1024*1024范围内的i];>/dev/null
真正的0M6461S
用户0M6435S
系统0M0016S
要快得多
$time perl-077-ne“打印解包*”/dev/null
真正的0M0007
用户0M0006S
系统0M0003S
head-c2M用于将输出限制为2MB
从理论上讲,在一个周期内处理8个字节应该比只处理1个字节更快,尽管我不知道如何使用perl提高效率
$time/dev/null
真正的0M0027S
用户0M0019S
系统0M0010S
在中,有一些答案可以使用空格分隔符生成十进制数字,速度为每秒GB或每秒数十GB。在没有任何空格的情况下只生成二进制值应该比在您的情况下生成二进制值快很多。我对其中一些答案进行了调整,以生成0和1。以下是我的Ubuntu 18.04 VM Core i7-8700 2GB RAM上的一些基准测试:
$time LC_ALL=C tr'\0-\377'[0*128][1*128]'/dev/null
实数0M0012S
用户0m0003s
系统0M0012S
$time jot-s-r-c$2*1024*1024 48>/dev/null
真正的0M0297S
用户0M0279S
系统0M0008S
$time shuf-r-n$2*1024*1024-i0-1-z | tr-d\0>/dev/null
真正的0M0383S
用户0M0384S
系统0M0000S
事实上,/dev/uradom甚至不够快,可以替换为为什么您得到的随机数据是不可接受的?当你所需要的似乎与你所要求的相符时,你所需要的并不是很有帮助。或者你的意思是你想把它扩展成一个代表字符0和1的ASCII序列?我只是用上面的命令得到一些随机数据。但是我想要一个只包含随机生成的0和1的文件?管道通过perl-0777-ne“print unpacb*”之类的东西,这正是您在问题中所要求的。。。生成0和1的随机模式并将其存储在文件中。你说Uradom只从内核获取随机数据。。。您希望从何处获取数据?然后你说它会复制到一个你不需要的文件。。你需要什么?你写的问题是生成一个随机文件吗???顺便说一下,您已经将问题标记为二进制文件,因此我假设您希望它是二进制的。你能编辑你的问题并决定你想要什么吗?直接从二进制值生成字符串要比只使用每个周期生成的32或64位中的一个位并扔掉其他位快数千倍。是的,我的解决方案在回顾中相当糟糕:-三重一的显然是更好的方法