Very Hard Delight Life

日々の記録を短めに記述。

[sh][Linux] ランダムな4桁の16進数を生成するfasterな方法

ag-48.hatenablog.com

前回の続き.

naive過ぎるので

cat /dev/urandom | tr -dc [:xdigit:] | \
head -c `expr 4 \*1024` | \sed -e 's/\(.\{4\}\)/\1\n/g'

と改良.

これならばランダム性と4桁必ず出ることが保証されている. そして短い. 0.023 sec 程度の実行速度なので,ダントツで早い.

ランダムな4桁の16進数を生成するnaiveな方法

cat /dev/urandom | tr -dc '[:xdigit:]' | head -c 4 | tr '[:upper:]' '[:lower:]'

最後のtrコマンドはおまけ.

cat /dev/urandomは処理時間が掛かるためhead -c 1000 /dev/urandomの方が早い. ただし,必ずしも毎回4桁出力されるわけではない点に注意.

for i in `seq 0 1023`; do
  <上記コード>
done

のような場合,2種類を試すと,

method time [sec]
cat 26.161
head 2.769

となり約9.5倍程度の差がついた. なお10回の試行をタイムコマンドで計測した平均を用いている.

xargsでシェル組込み機能(リダイレクトなど)を使う

参考: xargsでもパイプとかif文とか使いたい - BlankTar

  echo -n >cmd_list
  for f in `find . -type f -name ".log"`; do 
    echo "perl foo.pl ${f} 2>&1 log_${foo/./_result.}" >> cmd_list
  done
  cat cmd_list | xargs -I % sh -c "%"

xargsコマンドで並列処理を簡単に行うことができます。 ただ、パイプなどシェルの組込み機能を使おうとすると、xargsコマンドでは上手く処理できません。 sh(任意のシェル)コマンドを用いるとパイプライン処理やリダイレクト、はたまたifとかができるようです。

First Post

本ブログは以下を目指します。

  1. 短めに記載します。だいたい400文字以内。
  2. できるだけ頻繁に更新します。目標は毎日。
  3. 記載する内容はおよそ以下の通り。
    • 研究: 読んだ論文などの話題。
    • 技術系1: スクリプト言語、主にシェルスクリプト
    • 技術系2: ハードウェア記述言語(VHDL, Verilog-HDLどちらも)およびハードウェア(主にFPGA)。
    • 映画: レンタルもシアターも。
    • 音楽: HaFaBraすべてに対応。
  4. メモ書き程度でも公開し、インプットとアウトプットを重視。

以前もブログをやっていたものの、最近はアウトプットをサボっていたことを反省して再起動します。

以後、お見知りおきを。