【问题标题】:how to make a unsorted version of this code如何制作此代码的未排序版本
【发布时间】:2021-12-24 00:51:07
【问题描述】:
这个打印二进制真值表的代码我怎么能改变它来打印相同大小的随机二进制数
     N = 4

    with open('input.txt', 'w') as file:
    file.writelines(f'{bin(i)[2:]:>0{N}}\n' for i in range(2**N))

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: python python-3.x random shuffle


【解决方案1】:

让我们稍微重写一下你的代码:

data = range(2**N)
with open('input.txt', 'w') as file:
    file.writelines(f'{bin(i)[2:]:>0{N}}\n' for i in data)

对于像N = 4 这样的小数字,您可以只打乱数字列表而不是使用range

from random import shuffle

data = list(range(2**N))
shuffle(data)
with open('input.txt', 'w') as file:
    file.writelines(f'{bin(i)[2:]:>0{N}}\n' for i in data)

N > 10 左右开始,您开始遇到随机性问题,因为考虑到 Mersenne Twister 的构造方式,许多排列是不可能的。

【讨论】:

  • 使用writelines 的原始代码实际上不会一次在内存中实现任何巨大的字符串。它没有正确记录,但file.writelines(iterable) 实际上确实作为for item in iterable: file.write(item) 的优化等效项运行(正是为了避免大量内存浪费而无益)。如果 OP 使用 listcomp,它会浪费大量内存,但genexpr 是理智的。
  • 另外,请注意,shuffle 会随机播放并返回 None,因此您必须调整第二个示例。
  • @ShadowRanger。新手错误已修复。不知道为什么我没有想清楚。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2018-06-30
  • 1970-01-01
相关资源
最近更新 更多