MATLAB循环随机修改字符串字符

时间:2017-10-06 06:10:25

标签: regex string matlab random

我最近开始在MATLAB中编程,并尝试实现一个类似1337扬声器的发生器/弦乐器操作器,只是为了好玩。作为一个挑战,我试图随机改变每个字符的出现次数,以便不是所有的“a”都改为“@”。

似乎我的尝试在某种程度上起作用,因为它非常随意(但有时无效),但我相信有更好的方法来实现这一点。也许为26个字符中的每个字符添加更多替代品并分别从它们中随机选择?

function O = obfuscate(s)

str = 'hello world';

for i=1:length(str)
    randomNum = randi(26,1);

    switch randomNum
        case 1            
            str = regexprep(str, 'a', '@', 'once');
        case 2
            str = regexprep(str, 'b', 'l3', 'once');
        case 3
            str = regexprep(str, 'c', '<', 'once');
        case 4
            str = regexprep(str, 'd', '|]', 'once');
        case 5
            str = regexprep(str, 'e', '3', 'once');
        case 6
            str = regexprep(str, 'f', '|#', 'once');
        case 7
            str = regexprep(str, 'g', '6', 'once');
        case 8
            str = regexprep(str, 'h', '|-|', 'once');
        case 9
            str = regexprep(str, 'i', '!', 'once');
        case 10
            str = regexprep(str, 'j', '_/', 'once');
        case 11
            str = regexprep(str, 'k', '|{', 'once');
        case 12
            str = regexprep(str, 'l', '1', 'once');
        case 13
            str = regexprep(str, 'm', '|\/|', 'once');
        case 14
            str = regexprep(str, 'n', '/\/', 'once');
        case 15
            str = regexprep(str, 'o', '[]', 'once');
        case 16
            str = regexprep(str, 'p', '|*', 'once');
        case 17
            str = regexprep(str, 'q', '9', 'once');
        case 18
            str = regexprep(str, 'r', '|2', 'once');
        case 19
            str = regexprep(str, 's', '$', 'once');
        case 20
            str = regexprep(str, 't', '+', 'once');
        case 21
            str = regexprep(str, 'u', '|_|', 'once');
        case 22 
            str = regexprep(str, 'v', '\/', 'once');
        case 23
            str = regexprep(str, 'w', '\X/', 'once');
        case 24
            str = regexprep(str, 'x', '%', 'once');
        case 25
            str = regexprep(str, 'y', '¥', 'once');
        case 26
            str = regexprep(str, 'z', '2', 'once');
    end

   O = str;

    %fprintf('%s(%i)', str(i), randomNum);  
end

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您正在生成1到26之间的随机数,但仅在循环字符串时生成。在您的示例中,您只会生成11个随机数,因此在循环字符串时可能永远不会出现混淆。

这解释了为什么它会像你描述的那样“有时无效”。

例如,在一种情况下,您的随机数生成器可以连续生成10个2,这只会改变字符'b'。

您的示例中没有任何b,因此不会对任何文本进行模糊处理。

您可能更成功地使用地图容器(在Matlab帮助中搜索containers.map)将每个字符映射到模糊处理(以替换您的开关案例逻辑),而不是将其留给概率。

然后,你可以在例如...之间生成一个统一的随机数。在每个循环迭代中使用1和2来确定字符是否应该被混淆。

示例:

function O = obfuscate(s)

str = 'hello world';
keys ={'h','e','l','o','w','r','d'};
values = {'|-|','3','1','[]','\X/','|2','|]'};
obfuscationMap = containers.Map(keys,values);
tempCell = {}  %cell to hold the growing string

for i = 1:length(str)
    randomNum = randi(2,1);
    switch randomNum
        case(1) %obfuscate
            if(isKey(obfuscationMap, str(i)) %check key is in map to avoid missing chars
                tempCell{end+1} = obfuscationMap(str(i));
            else
                tempCell{end+1} = str(i);
            end
        case(2) %don't obfuscate
            tempCell{end+1} = str(i);
    end
end

O = strjoin(tempStr,''); %combine cell in single string without spaces

使用上面的代码,当randomNum为1时,你会得到一个混淆,如果randomNum是2那么你就不会。

因此,您应该比以前看到的更频繁地进行模糊处理。

您可能需要修改一下以获得您想要的内容。