2017-08-10 136 views
2

我想生成1和0的随机字符串(或数组)。然后根据1的数量(计数)对它们进行分类。我希望生成的字符串在可能的计数中均匀分布。Python中均匀分布的随机字符串

但是,下面的代码给我一个正态分布:

import numpy as np 

for i in range(num_examples): 
    seq = np.random.randint(2, size=(seq_length)).astype('float32') 
    sequences[i] = seq 

target_classes = [] 
for input in sequences: 
    target = (input == 1).sum() 
    target_classes.append(target) 

计数的直方图是:

enter image description here

一个NumPy的解决方案将是真棒。或者我需要正则表达式还是其他的东西?

+1

“所以,我要生成的字符串是均匀分布在这些课程中“ - 你为什么期望他们在这些课程中平均分配*?这就像在100个硬币翻转序列中预期0个头像与50个头一样可能。 – user2357112

+0

这看起来更像是一个数学或统计问题。一旦你知道产生你想分发的数学,把它转换成Python应该很简单。 – Barmar

+0

字符串?我没有看到你的意思...... –

回答

4

正如@Prune已经注意到的,这基本上是一个两步过程。首先,您需要创建一个“数量1”的统一分布(例如np.random.randint),然后您需要将许多“seq”元素设置为1(例如使用np.random.choice)。

一种可能性是:

import numpy as np 

NUM_EXAMPLES = 10000 
SEQ_LENGTH = 10 

sequences = np.zeros((NUM_EXAMPLES, SEQ_LENGTH), dtype=np.int8) 
# How many number of ones in each sequence 
number_of_1s = np.random.randint(0, SEQ_LENGTH+1, size=NUM_EXAMPLES) 

indices = np.arange(SEQ_LENGTH) 
for idx, num_ones in enumerate(number_of_1s.tolist()): 
    # Set "num_ones" elements to 1 using "choice" without replace. 
    sequences[idx][np.random.choice(indices, num_ones, replace=False)] = 1 

使用直方图显示,它似乎是相当均匀分布:

plt.hist(np.sum(sequences==1, axis=1), bins=np.arange(SEQ_LENGTH+2)-0.5, histtype='step') 

enter image description here

2

如果你想1的数量是平均分配的,那么我想你会发现它最容易第一产生的数量,然后随机分配,很多1的通过二进制表示。这是一个两步过程,几乎是必要的。

有了这个提示,你可以自己编码吗?

+0

我可以试试。我想我需要正则表达式,对吧? –

+0

不,一个**随机**调用来获取数量,然后在0字符串中分配多个1。在这里我看不到正则表达式的作用。 – Prune

+0

我想我甚至不需要随机电话。只是一个从0到(num_of_seq/len_of_seq)的整数数组。我会尽力实现“某些东西”的一部分。谢谢。 –