スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

乱数が絡むプログラムを検証する

単純で正しそうなものが正しいとは限らない - Radium Software
http://d.hatena.ne.jp/KZR/20081203/p2
を以前見て気になってた。
検証するには、上の記事のリンク先のように、実際に実行した結果に偏りがないことを確認すればよい。
しかし、数千回、数万回実行するのは時間がかかる。無駄だ。
もしrand()が可能な値全てを返すことができれば、何万回も実行しなくても検証できるのではないだろうか?
例えば、乱数を使ったこんなコードがあるとする。
int a = rand(5); // 0から4までの値を一つ返す
int b = rand(5); // 同様
printf("(a,b)=(%d,%d)\n", a, b);// (0,0),(0,1),…,(4,4)が等確率で表示される。
次のように書き換える。
for(int a = 0; a < 5; ++a) { // 0から4までの値を全部
for(int b = 0; b < 5; ++b) { // 同様
printf("(a,b)=(%d,%d)\n", a, b); // (0,0),(0,1),…,(4,4)が同じ数(1つずつ)表示される
}
}
つまり、rand()を使う代わりにfor文を使う。rand()の代わりに使うために、for文を関数のように扱いたい。Schemeのファーストクラスの継続を使えばそれを実現できる。
例えば、上の記事の、配列の中身をシャッフルするコードは以下のようになる。

続きを読む

スポンサーサイト

テーマ : プログラミング | ジャンル : コンピュータ

コードテスト

コード色付けテスト
local function neko()
  print(123)
end
--[=[
ぬるぽ
]=]

for i=1,100 do
  print("hogehoge")
  io.write[[
test
]]

end

テスト

テスト
あああ
ほげほげ

Luaで
print "Hello world!"
Schemeで
(display "Hello world!") (newline)
Haskellで
main=putStrLn "Hello world!"
プロフィール

minoki

Author:minoki
好きなプログラミング言語:
Haskell,Lua
GitHubアカウント
Twitter

最新記事
月別アーカイブ
カテゴリ
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。