---
# System prepended metadata

title: PokemonPRNGをPowerShellから直接使う

---

# PokemonPRNGをPowerShellから直接使う

あたりまえに「いくつ前のseedを使って〜」って話してるけど求め方書いたことなかったなって思って...

## はじめに

[![Readme Card](https://github-readme-stats.vercel.app/api/pin/?username=yatsuna827&repo=PokemonPRNG)](https://github.com/yatsuna827/PokemonPRNG)

夜綱さんが公開している乱数調整ライブラリ[PokemonPRNG](https://github.com/yatsuna827/PokemonPRNG)は、.NETで乱数調整ツールを作成する際に非常に便利です。いつもお世話になっております。

このライブラリをPowerShellから直接触れるようにすると、seed間の消費数の計算や、あるseedからいくつ進める/戻すといった計算を、ツールを使わずともコマンドラインから簡単に利用できるようになります。

## 導入

上記リポジトリのReleaseよりダウンロードした最新のnupkgをzipにリネームし、`PokemonPRNG.dll`を取り出して`[System.Reflection.Assembly]::LoadFrom`で参照するだけです。

(読んで分かれば)以下丸ごとPowerShellにコピペすれば完結です。PowerShellの起動時に自動で読み込むように`$PROFILE`に追記しています。

```powershell
cd $env:USERPROFILE
Remove-Item -Recurse -Force PokemonPRNG -ErrorAction Ignore

# URLは適宜最新のものに変更してください。
$url = "https://github.com/yatsuna827/PokemonPRNG/releases/download/v3.2.0/PokemonPRNG.3.2.0.nupkg"
curl $url -Lo PokemonPRNG.3.2.0.zip
Expand-Archive -Path PokemonPRNG.3.2.0.zip -DestinationPath PokemonPRNG
Remove-Item PokemonPRNG.3.2.0.zip

# $PROFILEに追記します。
$command = "[System.Reflection.Assembly]::LoadFrom(""$env:USERPROFILE\PokemonPRNG\lib\netstandard2.0\PokemonPRNG.dll"") *>`$null"
if (Test-Path $PROFILE) {
    $command | Out-File -Append $PROFILE
} else {
    mkdir (Split-Path $PROFILE -Parent)
    $command | Out-File $PROFILE
}
```

## 使い方

PowerShellを再起動し特にエラーが出なければ、以下の要領でPokemonPRNGが提供する機能を使えるようになっているはずです。たとえば私が主にやっているXD乱数では、主にこんな感じで使います。

```powershell
# 厳密にはこの場合は末尾の"U"は必要はありませんが... 紛らわしいので全てに付けておけばいいでしょう
$seed=0xbadfaceU

# seedを1つ進めて乱数値を取得します
[PokemonPRNG.LCG32.GCLCG.GCLCGExtension]::GetRand([ref]$seed)

# 1つ前のseedを表示します
[PokemonPRNG.LCG32.GCLCG.GCLCGExtension]::PrevSeed($seed, 1)
# -> 195951310
# 出力は10進数なので、適宜16進数表記に変換します。
[PokemonPRNG.LCG32.GCLCG.GCLCGExtension]::PrevSeed($seed, 1) | %{[System.Convert]::ToString($_, 16)}
# -> badface

# seedを1000進めます
[PokemonPRNG.LCG32.GCLCG.GCLCGExtension]::Advance([ref]$seed, 1000)

# seed間の消費数を求めます
$pivot = 0xbadfaceU
$target = 0xdeadfaceU
[PokemonPRNG.LCG32.GCLCG.GCLCGExtension]::GetIndex($target, $pivot)
```

PowerShellでは拡張メソッドを使えないという制約があるためあまりスマートな書き方ではないものの、一般的に乱数調整ツールに組み込まれているような計算を手動で柔軟に行うことができます。
