【问题标题】:MATLAB Loop to Randomly Modify String CharactersMATLAB 循环随机修改字符串字符
【发布时间】:2018-03-17 21:09:36
【问题描述】:

我最近开始在 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

有什么建议吗?

【问题讨论】:

  • 我不明白您是如何决定选择替代品的?您能在这里向我们展示简单的输入和预期输出吗?
  • 当然。我已将此函数硬编码为使用str = 'hello world',但您可以将其更改为str = s,以便在运行混淆('your text here')时接受参数。根据要求,为“hello world”运行此函数可能会产生不同的结果,因为它是随机的。一种可能的结果是:|-|3llo w[]rld
  • so that not all “a” are changed to “@“ ... 好的,但是“hello world”与“not all a”有什么关系?
  • 我很抱歉。这是一个通用的例子。我应该说不是所有的“e”都变成了“3”。

标签: regex string matlab random


【解决方案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 则你不会。

因此,您应该比以前看到的更频繁地受到混淆。

您可能需要稍作修改才能得到您想要的。

【讨论】:

  • 优秀的答案!我不知道它可以通过这种方式实现,尽管您的建议超出了我作为 Matlab 新手用户的范围。任何更多建议,或者我可以分析的简单示例,将不胜感激!
  • 这正是我想要的(还有一些调整)。极好的!你教会了我一些新东西,我非常感激。我期待更频繁地使用映射!非常感谢你,詹姆斯。
猜你喜欢
  • 2012-07-24
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2017-05-20
相关资源
最近更新 更多