如何用随机数替换数字串中的数字

时间:2014-12-18 17:24:14

标签: string matlab random

我有一个字符串,它是一个介于0-9之间的数字序列,我想用随机数替换该字符串中的一些数字,但我无法使用{{1} }或rand因为我一直收到以下错误:

randi

以下是我目前正在尝试更改字符串的某些数字的内容:

Conversion to char from cell is not possible.

Error in work (line 58)
                mut(i,7:14) = {mute_by};

% mutate probability 0.2 if (rand < 0.2) % pick best chromosome to mutate mut = combo{10}; mute_by = rand([0,9]); for i = 1:5 mut(i) = {mute_by}; end end 代表字符串mut

我该怎么做呢?我认为它会相当简单,但我现在已经翻过文档一段时间了,我无法找到解决方案。

1 个答案:

答案 0 :(得分:2)

如果要替换字符串中的特定位置,我会做的是生成代表logical的{​​{1}}数组,否则生成true。如何确定这一点是通过生成与字符串大小相同的随机浮动指向点数,并检查它们的值是否为false。对于字符串中满足此约束的任何位置,请将其替换为另一个随机整数。

执行此操作的最佳方法是将字符串转换为实际数字,以便您可以实际修改其位置,创建我们的< 0.2数组,然后在这些坐标处用随机整数替换这些值。

这样的事情:

logical

让我们慢慢浏览一下这段代码。 rng是一个随机种子生成器,我将其设置为rng(123); %// Set seed for reproducibility mut = '110202132224154246176368198100'; mut_num = double(mut) - 48; n = numel(mut_num); vec = rand(1, n) < 0.4; num_elem = sum(vec); mut_num(vec) = randi(10,1,num_elem) - 1; mut_final = char(mut_num + 48); ,这样您就可以重现与随机数生成相同的结果......当然是随机的。我将你的数字声明为123,然后我有一个很好的技巧,可以将字符串中的每个字符转换为数字数组的单个元素。我通过转换为string,然后减去48来执行此操作。通过转换为double,每个元素都会转换为ASCII code,因此double将为48,{ {1}}将是49,依此类推。因此,我们需要将值减去 48,以便我们可以将其降低到0的范围。然后,我计算字符串与numel的长度,然后通过生成我们谈到的1向量来确定要替换的值。

然后我们计算需要更改的元素数量,然后生成一个完全这个大小的随机整数向量,我们使用这个[0-9]向量来索引我们最近转换的带有随机整数的字符串(存储为数字数组)。请注意,logical生成的值从1到您想要的最大值。因为从1开始,我必须生成最多10个,然后减去 1. logical的输出放入我们的数值数组,然后我们将数值数组转换为带有randi的字符串。请注意,我们需要添加 48,才能在创建字符串之前将数字转换为ASCII等效值。

我已经将概率改为0.4,以便更好地看到变化。设置为randi我几乎没有注意到任何变化。 char将包含已更改的字符串。这是他们的样子:

0.2

mut_final包含您要更改的字符串中的那些位置,从第2个位置,第3个位置开始等。>> mut mut = 110202132224154246176368198100 >> vec vec = Columns 1 through 13 0 1 1 0 0 0 0 0 0 1 1 0 0 Columns 14 through 26 1 1 0 1 1 0 0 0 0 0 0 0 1 Columns 27 through 30 1 1 1 0 >> mut_final mut_final = 104202132444143248176368195610 中的相应位置相对于vec进行更改,而字符串的其余部分未被触及,最终存储在mut