将文件中的数字与随机数相乘

将文件中的数字与随机数相乘

我有一个文件,其中包含如下行:

tree my_tree = ((t1:961.00,t2:902.00):961:00,t3:878:00);

它表示具有分支长度的树结构。我想将每行中的所有分支长度(即后面的数字):乘以 0 到 1 之间的(最好是唯一的)随机数。此外,如果有任何随机数生成器实用程序可以指定分布,比如给定平均值和标准差的正态分布,那就太好了。

我知道如何生成特定范围 >1 内的随机数。我还知道如何在文件中用 sed 替换正则表达式$RANDOM。但我仍在努力完成任务。shufsed -i 's/:[0-9\.]+/My_RANDOM_NUMBER/g' my_file

谢谢!

答案1

我会使用类似perlawk可以处理算术运算的东西,而不是sed(它实际上只能进行正则表达式替换)。

例如,使用perl

$ printf 'tree my_tree = ((t1:961.00,t2:902.00):961:00,t3:878:00);\n' | 
    perl -pe 's/:([0-9.]+)/sprintf ":%.2f", $1*rand()/ge'
tree my_tree = ((t1:918.95,t2:880.40):633.34:0.00,t3:648.35:0.00);

您可以使用您选择的另一个随机库函数替换 perl 的库rand()函数 - 例如,使用包Math::Random中的函数libmath-random-perl

$ printf 'tree my_tree = ((t1:961.00,t2:902.00):961:00,t3:878:00);\n' | 
  perl -MMath::Random=random_normal -pe 's/:([0-9.]+)/sprintf ":%.2f", $1*random_normal(0.0, 1.0)/ge'
tree my_tree = ((t1:-362.08,t2:822.35):-254.87:0.00,t3:1158.46:0.00);

相关内容