C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 24 を表示中)
■10743 / )  Re[6]: Rnd関数について
□投稿者/ れい (240回)-(2007/11/25(Sun) 01:41:11)
また脱線してしまいますが。

■No10718 (魔界の仮面弁士 さん) に返信
> そういう話ではなく、そもそも仕様許諾契約書にて、
>  リバースエンジニアリング
>  逆コンパイル
>  逆アセンブル
> の禁止がうたわれていませんでしたっけ? 抵触しそうな気が。

「リバースエンジニアリング」の範囲がよくわからなくて困ります。

Rndが線形合同法なのも24bitなのも、少し使ってればわかります。
もちろん調べたらすぐにわかります。
他のライブラリも、使ってれば中身がある程度わかります。
というか、中身が全くわからないものは使えません。

で、わからないライブラリを使うためにミニマムコードとか作って振舞いを調べるわけですが、
これってリバースエンジニアリングとも言えます。

どこまで許されるのか、境界があいまいで、いつも悩みます。
結局、状況に応じて個々に判断しなきゃいけなくて、煩雑です。

■No10729 (VBファン さん) に返信
> 結局Rnd関数は非公開でオープンソースではないということですね。

ソースは非公開ですがアルゴリズムはパブリックドメインです。
「全く同じものを作る」というのは上で述べてるように
「検証」が「リバースエンジニアリング」にあたる可能性があります。

やろうとしていることが権利者の不利益になる場合は何か言われる可能性もあります。

> 自分たちで作るとしたらかなり時間はかかりますができないことはないという
> ことでよろしいのでしょうか?

「同じ機能」の実装を自分でつくるのは非常に簡単です。
線形合同法なら私はこんなのを使います。

x = (UInt32)((UInt64)x * 1664525 + 1013904223);

0以上1未満が欲しいならr1とr2を関連性のない32bitの乱数とし、

(r1 * (double)(2 << 11) + r2) / (double)(2 << 53);

とすればOKです。

おせっかいですが。

他の方法も述べておきます。
知名度が低いですが、XorShiftという方法もあります。
例えば次のようなコードでできます。x,y,z,wを種として、
            UInt32 t;
            t = (x ^ (x << 11));
            x = y; y = z; z = w;
            return (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)));
オススメです。
著名なMTやSFMTという方法もあります。

返信 編集キー/


管理者用

- Child Tree -