我有一个初始字符串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
答案 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))