情報技術科ここだけトピックス
疑似乱数
サイコロをふってでる目のように、不規則な動きをさせてみたい。
C言語にはランダムな値を得るしくみとして、rand( )と初期化のためのsrand( )関数があります。rand( )だけではいつも同じ順番に数が得られてしまうのでsrand( )に現時刻を与えることで不規則な値を得るように見せかけることができます。
基本的にC言語など多くのプログラミング言語で準備されている乱数の仕組みは疑似的なものなので、疑似乱数と呼びます。
うるう年
でも、うるう年ごとにスマホやパソコンの日付を設定せずに自動で表示されています。
うるう年は「4の倍数年にあり、でも100の倍数年には無く、でも400の倍数年にはある」というものです。
法則性があれば、プログラムで解決しやすいことになります。
たとえばC言語などで丁寧に組み立てるとしたら、次のように
if(year % 4 == 0){
if(year % 100 == 0){
if(year % 400 == 0){
days = 29;
}else{
days = 28;
}
}else{
days = 29;
}
}else{
days = 28;
}
考え方次第では、もっと少ない処理で同じことができます。(%は余りを求める演算)
10の乗数を表すSI接頭辞(2)
小さな数を表す接頭辞(接頭語)としては、
m(ミリ)=10-3=0.001 ※千分の1
μ(マイクロ)=10-6=0.000001 ※百万分の1
n(ナノ)=10-9=0.000000001 ※十憶分の1
p(ピコ)=10-12=0.000000000001 ※一兆分の1
f(フェムト)=10-15=0.000000000000001 ※千兆分の1
・・・と続きます。
たとえば通信時間1ms(ミリ秒)なら 0.001s(秒)という換算になります。
あるCPUが2GHz動作で足し算に4クロックかかる場合
4÷(2×109) = 2×10‐9
なので処理時間は 2ns(十億分の2秒)と考えられます。
可逆圧縮と非可逆圧縮
「かぎゃくあっしゅくとひかぎゃくあっしゅく」早口言葉ではありません。
様々な手法でデータ量を小さくすることを圧縮といいます。その中で、圧縮後に元と同じデータが再生できる手法は可逆(Lossless)、圧縮後の再生データは元と異なる手法が非可逆(Lossy)に分けられ、非可逆は多くの場合圧縮率が高くなります。
元に戻せないと困る文書等には可逆圧縮を用いて、画像や音声は人間の感覚で気づかない部分もあるため非可逆圧縮でデータ量を大幅に削減して活用されています。
0.01が0.01ではない??
数値を2の倍数(…21,20,2-1,2-2…)の組み合わせで扱う場合、10進数の 0.01 は切りよく表せません。
例えばプログラムのつくり方によっては、0.01を1万回足すと100.00のはずが100.002953、100万回足すと10000.00のはずが9865.223633が出ます。(同じ値を足しているのに増えたり減ったりします。なぜか考えてみましょう)
銀行の利息や商品の税額計算で、あるべき値が出ていなかったら大きなトラブルになってしまいますね。
※プログラミング言語によっても幾つかの内部表現方法があります。今回の値の変化は「https://paiza.io/ja」のC言語で出力したものです。