Hatena::ブログ(Diary)

C++でゲームプログラミング

2012-02-24

[]Vim script乱数の生成

下記のサイトに Vim script乱数を生成する方法が載っているのですが、それを元にして C++っぽい生成器を書いてみました。


[ソース]

function! s:srand(seed)
    let self = {}
    let self.seed = a:seed
    function self.apply()
        let self.seed = self.seed * 214013 + 2531011
        return (self.seed < 0 ? self.seed - 0x80000000 : self.seed) / 0x10000 % 0x8000
    endfunction
    return self
endfunction

function! s:uniform_int_distribution(min, max)
    let self = {}
    let self.min = a:min
    let self.max = a:max
    function! self.apply(engine)
        let num = a:engine.apply()
        return num % ((self.max+1)-self.min) + self.min
    endfunction
    return self
endfunction

function! s:discrete_distribution(list)
    let self = {}
    let self.list = a:list
    function! self.apply(engine)
        let num = a:engine.apply()
        return self.list[ num % len(self.list) ]
    endfunction
    return self
endfunction

function! s:variate_generator(engine, dist)
    let self = {}
    let self.engine = a:engine
    let self.dist = a:dist
    function! self.get()
        return self.dist.apply(self.engine)
    endfunction
    return self
endfunction


function! s:main()
    let engine = s:srand(localtime())

    let distribution = s:uniform_int_distribution(1, 10)
    echo map(range(30), "distribution.apply(engine)")

    let list = ["homu", "mami", "mado", "saya", "an"]
    let list_dist = s:discrete_distribution(list)
    for n in range(10)
        echo list_dist.apply(engine)
    endfor
endfunction
call s:main()

[出力]

[9, 3, 8, 1, 2, 1, 5, 5, 2, 6, 1, 7, 9, 2, 2, 9, 7, 4, 9, 6, 7, 4, 7, 2, 1, 2, 6, 1, 6, 8]
an
saya
saya
homu
mado
mami
mado
homu
homu
mado

乱数の処理はそのまま流用して、乱数の範囲等を処理する部分を構造化しています。

まぁ UI がおもいっきり C++ ライクになっているのでもうちょっと Vim script 寄りにしてもいいかな。

ところで、Vim script乱数は何に使うんですかね。


[参照]

http://d.hatena.ne.jp/mFumi/20110920/1316525906

http://vim-users.jp/2009/11/hack98/

http://cpplover.blogspot.com/2009/11/c0xrandom.html

https://github.com/ynkdir/vim-funlib

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/osyo-manga/20120224/1330010630
リンク元
Connection: close