生成具有预定义最小长度的部分字符串(Matlab)

时间:2015-07-14 05:01:21

标签: string matlab random-sample

我有一个初始字符串Init = {ABCDEFGH}。如何从Init字符串生成100个具有以下条件的部分字符串(随机):

A pre-defined minimum lengths. 
The order of elements in each partial string should be from 'A' to 'Z'. 
No repeated characters in each partial strings 

预期输出应如下:100个部分字符串,每个部分字符串的最小长度为5

  Output = {'BCEGH';'ACEFG';'ABCDEF';'BCFGH';'BCDEG';....;'ABEFH';'ABCEGH'}
  numel(Output) = 100

1 个答案:

答案 0 :(得分:1)

为此,我开始为每个部分字符串的长度生成随机数。然后我生成了与每个字符串中每个字母对应的随机数。然后我将这些数字转移到相应的字母中。评论应解释其余部分。

n=100 %// how many samples to take
C='ABCDEFGH' %// take samples from these letters
maxL=numel(C) %// the longest string
minL=5 %// the shortest string
len=randi([minL maxL],[n 1]) %// generate length of each partial string
arrayfun(@(l) C(randsample(1:8,l)),len,'uni',0) %// randomly sample letters to give strings of correct length

n=4给出了例如

ans = 
    'CFHABEDG'
    'CFHABE'
    'FAHBE'
    'DGHFABE'

我不确定这是否真的是随机的,因为它假设每个长度的字符串数量相同,但我不认为这是真的。我认为应该根据每个长度的字符串数加权len。我(但我不确定)这应该解决这个问题:

for i=1:(maxL-minL+1)
    w(i)=factorial(minL-1+i)*nchoosek(maxL,minL-1+i);
end
len=minL-1+randsample(1:(maxL-minL+1),n,true,w./sum(w))