14

乱数を取得するには、シェルなどからさまざまな方法があることを知っています。ただし、ほとんどコンパイルされていないAndroidフォンでvimを実行しています。また、厳密にランダムである必要はありません。ポイントは、Vim で合理的に適切な乱数のシーケンスを取得するための興味深い、簡潔な、または高速 (つまり、vim ネイティブ関数を使用)、または短い方法は何ですか?

4

3 に答える 3

18

次のようなものを試してください

function Rand()
    return str2nr(matchstr(reltimestr(reltime()), '\v\.@<=\d+')[1:])
endfunction

. いくつかの時間関数を使用するよりも良いオプションはありません(それらには と の2つがありますreltime() がlocaltime()、後者は毎秒のみ更新されます)。シェルは遅く、時間ベースのソリューションを信頼していないため、乱数を避けるか、pyeval('random.randint(1, 10)')(前に) を使用することをお勧めします。python import random

注:ドキュメントには、によって返されるアイテムの形式はreltime()システムに依存すると書かれているため、ナノ秒が含まれている場合のように見えるreltimestr()ものではなく、を使用しています。reltime()[1]

于 2012-10-05T04:23:19.650 に答える
9

私は最近、自分で Vim スクリプトで乱数をいじってみました。その過程で見つけたいくつかのリソースを次に示します。

Vim スクリプトなし

可能であれば、必ず外部の乱数ジェネレーターを使用してください。原則として、これらは Vim スクリプトで実行できるものよりも優れており、高速です。

たとえば、試してみてください

  • :python import random; print random.randrange(1, 7)
  • :echo system('echo $RANDOM')
  • Ruby などの別のスクリプト言語

ライブラリ

Vim スクリプト ライブラリ。これらは、まともな品質の RNG 実装を提供するよう努めています。

  • vital.vimは、vim-jp ユーザー グループによって作成された優れた包括的なライブラリです。彼らの乱数ジェネレーターは印象的な一連の機能を備えており、私が知っている中で最高の純粋な Vim スクリプト RNG です。vital.vim は Xorshiftアルゴリズムを使用します。見てみな!

    Vital.vim でサイコロを振る:

    let Random = vital#of('vital').import('Random')
    echo Random.range(1, 7)
    
  • vim-rngは小さな乱数ジェネレーター プラグインです。これは、キャリー付き乗算アルゴリズムに依存するいくつかのグローバル関数をエクスポートし。このプロジェクトは進行中の作業のようです。

    rng でサイコロを振る:

    echo RandomNumber(1, 6)
    
  • magnum.vimは、私自身の小さな大きな整数ライブラリです。最近、任意のサイズの整数を生成する乱数ジェネレーターを追加しました。XORSHIFT-ADD アルゴリズムを使用し。

    magnum.vim でサイコロを振る:

    let six = magnum#Int(6)
    echo magnum#random#NextInt(six).Add(magnum#ONE).Number()
    
  • Rndmは、他のライブラリよりもずっと長く使用されています。その機能は、いくつかのグローバル関数として公開されています。Rndm でサイコロを振る:

    echo Urndm(1, 6)
    

ディスカッションとスニペット

最後に、洞察に満ちたディスカッションと Vim スクリプト スニペットへのリンクをいくつか示します。

  • reltimeこのページの ZyX のスニペット。

  • GitHubの loreb のvimprng プロジェクトには、Vim スクリプトでの RNG 実装が非常に多くあります。非常に便利。

  • この古いメーリング リストのディスカッションには、いくつかの Vim スクリプトの断片があります。Bee-9 によって提供された最初のものは 16 ビットに制限されていますが、非常に効果的であることがわかりました。ここにあります:

    let g:rnd = localtime() % 0x10000
    
    function! Random(n) abort
      let g:rnd = (g:rnd * 31421 + 6927) % 0x10000
      return g:rnd * a:n / 0x10000
    endfunction
    
  • Bart の個人的な構成ファイルという名前の人にある別のスクリプト。

  • Vimcasts.org のエピソード 57 では、Vim の「式レジスタ」について説明し、全体を通して乱数の例を参照しています。この Stackoverflow の質問と ZyX のスニペットを参照してください。おすすめされた。

  • wikia の Vim wiki には記事「Jump to a random line」があり、まだ言及されていないリソースがいくつかあります。

于 2014-10-11T12:14:04.240 に答える