生成具有预定义最小长度的部分字符串 (Matlab)
Generate partial strings which have predefined minimum lengths (Matlab)
我有一个初始字符串 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
为此,我首先为每个部分字符串的长度生成随机数。然后我生成了对应于每个字符串中每个字母的随机数。然后我将这些数字转换成它们对应的字母。评论应该解释其余部分。
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))
我有一个初始字符串 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
为此,我首先为每个部分字符串的长度生成随机数。然后我生成了对应于每个字符串中每个字母的随机数。然后我将这些数字转换成它们对应的字母。评论应该解释其余部分。
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))