Mathematica仿真随机模拟

时间:2013-01-17 12:38:54

标签: wolfram-mathematica

我正在尝试模拟Mathematica中a和b两部分的变异。 我把遗传漂变(完全随机元素)放在:

p[sim_, 0] = Join[Table[a, {15}], Table[b, {15}]]
p[sim_, t_] := p[sim, t] = RandomChoice[p[sim, t - 1], 30]

这创建了两个随机由a和b部分组成的表。

我想添加变异,以给定的概率发生,所以我尝试将以下内容添加到我的代码上面

Do[ReplacePart[p, i -> b] && If[RandomReal[] > .2, t], {t, 1, 15}]

因此,如果0到1之间随机抽取的数字大于.2,则应该替换原始两个表中的元素i。

所以我的最终代码看起来像是

p[sim_, 0] = Join[Table[a, {15}], Table[b, {15}]]
p[sim_, t_] := p[sim, t] = RandomChoice[p[sim, t - 1], 30];
Do[If[RandomReal[] < .2, 
  ReplacePart[p[sim, t], {_} -> RandomChoice[{a, b}]], 
  p[sim, t]], {t, 1, 15}]

但我可以告诉它不能正常工作,因为更改RandomReal值必须大于没有做任何事情,但我没有收到错误信息。

谁能告诉我出了什么问题?任何帮助将不胜感激!!

1 个答案:

答案 0 :(得分:2)

不确定这是否是您唯一的问题,但是ReplacePart对P []返回的结果进行操作,但不会影响函数本身, 即

f[0]={1,2,3}
ReplacePart[f[0],2->42] -> {1,42,3}

但你仍然得到:

f[0] -> {1,2,3}

另外

{_} -> 

告诉ReplacePart替换每个项目。我不确定你的意图是什么...... 第一个化身i->似乎有道理..