我需要创建32位数字(有符号或无符号无关紧要,最高位永远不会被设置),每个数字必须设置给定的位数.
最简单的解决方案当然是从零开始.在循环内,数字现在增加1,计数位数,如果计数具有所需值,则数字存储到列表中,否则循环重复.如果找到足够的数字,则停止循环.当然这很好用,但是一旦所需位数变得非常高,它就会非常慢.
具有(比方说)5位的最简单的数字是设置前5位的数字.这个号码可以很容易地创建.在循环内,第一个位置位,数字向左移一个.这个循环运行5次,我找到第一个设置了5位的数字.接下来的几个数字也很容易创建.我们现在假装数字为6位宽,最高位数未设置.现在我们开始将第一个零位向右移动,因此我们得到101111,110111,111011,111101,1111110.我们可以通过在前面添加另一个0并重复此过程来重复此操作.0111110,1011110,1101110等.然而,这种方式的数字增长速度将超过必要的速度,因为使用这种简单的方法,我们省略了数字,如1010111.
那么有没有更好的方法来创建所有可能的排列,一种可以使用的通用方法,无论下一个数字将包含多少位,无论我们需要设置多少个位?
可能重复:
创建具有特定位数的多个数字
我正在尝试编写一些代码,通过将位移位来将每个可能的数字组合放在一个数组中.
例如,我想找到数组应该包含的3位(最大数字可以是6)的所有可能组合:
000111 001011 001101 001110 010011 010101 010110 011001 011010 011100 100011
等等...
根据我的解释,当最后一个位置为1时,我们将数字移1(x >> 1)并在开始时加1.但是,我不确定如何编写其余的代码.我用C来写这个.
另外 - 据我所知,这是一个colex序列,但是,如果有另一个序列可以给我相同的最终结果(具有约束为N的k位的所有可能组合的数组),我都是耳朵. .
请问,我怎样才能获得所有这些二进制排列,但在Python中没有重复?
a = list(itertools.permutations([1, 1, 0, 0]))
for i in range(len(a)):
print a[i]
(1, 1, 0, 0)
(1, 1, 0, 0)
(1, 0, 1, 0)
...
Run Code Online (Sandbox Code Playgroud)
如果它大致有效将会很棒,因为我必须使用这样的30个元素列表.
我想知道是否有任何方法可以n从数字列表中获取所有长度组合.
例如,如果我的列表是[1, 2, 3, 4],我想输出(如果我选择n = 3)
[1, 2, 3]
[1, 2, 4]
[1, 3, 4]
[2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
像[2,1,3]这样的其他排列对我没用.
我需要以随机顺序生成具有相同数量的1(或0)的二进制数.
有谁知道固定长度二进制数的任何有效算法?2个1位和4位数的示例(只是为了更清楚):
1100
1010
1001
0110
0101
0011
Run Code Online (Sandbox Code Playgroud)
更新无 重复的随机顺序非常重要.需要二进制数的序列,而不是单个排列.
您是否知道如何使此功能更加节省时间?
def c(n):
word = 32
#l = []
c = 0
for i in range(0, 2**word):
#print(str(bin(i)))#.count('1')
if str(bin(i)).count('1') == n:
c = c + 1
print(c)
if i == 2**28:
print('6 %')
if i == 2**29:
print('12 %')
if i == 2**30:
print('25 %')
if i == 2**31:
print('50 %')
if i == 2**32:
print('100 %')
return c
135274023 function calls in 742.161 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 391.662 391.662 742.161 …Run Code Online (Sandbox Code Playgroud) algorithm ×3
combinations ×3
python ×3
permutation ×2
python-3.x ×2
binary ×1
c ×1
math ×1
profiling ×1