init_dataプロシージャの中で自作の乱数プロシージャArndを呼んでいるが
init_dataの呼び出し箇所では1未満の実数を期待するような処理をしているのに対して
Arndは1を超える数を返しうるのでおかしくなっているようだ。
set r1とset r2の箇所をこう変えたら動く。

set r1 [expr int(rand()*$data_num)]
set r2 [expr int(rand()*$data_num)]

Arndの実装は意図がよくつかめないけどpow(2, 32)って出てくるので
32ビットアーキテクチャでのオーバーフローに依存しているのかもしれない。