наивный алгоритм:
$len=strlen($myString); // we will not recalc it
$allowed=array('!','~');
for(int $i=0;$i<$countOfChars;++i){
$x=rand(0,$len); //put after $x characters;
$char=$allowed[array_rand($allowed)];
$myString=substr($myString,0,$x).$char.substr($myString,$x);
++$len;
}
Но я думаю, что вы должны забыть об этой идее, и вы по-другому решите свою проблему