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

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

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

Re[11]: Rnd関数について


(過去ログ 24 を表示中)

[トピック内 19 記事 (1 - 19 表示)]  << 0 >>

■10662 / inTopicNo.1)  Rnd関数について
  
□投稿者/ VBファン (1回)-(2007/11/23(Fri) 11:14:29)

分類:[.NET 全般] 

乱数を発生させるRnd関数ですが、このライブラリはどのようにできているのですか?
わかる方がおりましたら、VBかC#のコードでおしえてください。
引用返信 編集キー/
■10663 / inTopicNo.2)  Re[1]: Rnd関数について
□投稿者/ れい (226回)-(2007/11/23(Fri) 11:34:18)
No10662 (VBファン さん) に返信
> 乱数を発生させるRnd関数ですが、このライブラリはどのようにできているのですか?
> わかる方がおりましたら、VBかC#のコードでおしえてください。

コードはわかりません。
非公開だと思います。
あと2〜3週間したらわかるかもしれませんが。

わかる範囲で答えると。

VBMath.Rndは伝統的に線形合同法になっています。
24bitの掛け算と足し算、剰余の計算で導かれます。
x = (x * A + B) % 0xFFFFFF
で計算しています。
AとBの値は知りませんが、
Rndを2回呼んで連立方程式を解けばわかります。
知りたければご自分でどうぞ。
すぐにわかりますが、乱数としてはかなり問題があります。
乱数の品質の割には速度も遅く、ろくに分布もしてくれないので、
使わないほうがいいでしょう。

System.RandomはKnuthの引き算法です。
配列に種を入れておいて、前後の値を引き、0以下になったら最大値に戻すという方法です。
これはかなり良い乱数生成法です。
いくつか欠点がありますが、速度もメモリ使用率も分布の仕方もよい方法です。
とくに初期化が難しいので、変な種を入れるとダメなときがあります。
引用返信 編集キー/
■10664 / inTopicNo.3)  Re[1]: Rnd関数について
□投稿者/ επιστημη (674回)-(2007/11/23(Fri) 11:50:23)
επιστημη さんの Web サイト
つ【http://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E4%B9%B1%E6%95%B0


引用返信 編集キー/
■10668 / inTopicNo.4)  Re[2]: Rnd関数について
□投稿者/ カンタービレ (89回)-(2007/11/23(Fri) 12:36:04)
Reflector for .NET を使ってみる、という選択肢もありマス。

引用返信 編集キー/
■10706 / inTopicNo.5)  Re[3]: Rnd関数について
□投稿者/ 中博俊 (1209回)-(2007/11/24(Sat) 09:38:56)
中博俊 さんの Web サイト
> Reflector for .NET を使ってみる、という選択肢もありマス。

まぁまさか使ってはいけないという.NETのライブラリを見る人はいないと思いますが。
引用返信 編集キー/
■10716 / inTopicNo.6)  Re[4]: Rnd関数について
□投稿者/ カンタービレ (93回)-(2007/11/24(Sat) 14:10:29)
No10706 (中博俊 さん) に返信
>>Reflector for .NET を使ってみる、という選択肢もありマス。
>
> まぁまさか使ってはいけないという.NETのライブラリを見る人はいないと思いますが。

反面教師、って言葉もありマス(^^;
使おうとするライブラリの動きを知るためであれば参考にはなりマスね。
作った覚えのないファイルがテンポラリに一時的に作成されていたり、
見えない仕様は中身を見て知ることが出来マス。

勉強材料として見るのであれば中サマの言う通りお勧め出来ないデスね。
引用返信 編集キー/
■10718 / inTopicNo.7)  Re[5]: Rnd関数について
□投稿者/ 魔界の仮面弁士 (532回)-(2007/11/24(Sat) 14:32:30)
No10716 (カンタービレ さん) に返信

そういう話ではなく、そもそも仕様許諾契約書にて、
 リバースエンジニアリング
 逆コンパイル
 逆アセンブル
の禁止がうたわれていませんでしたっけ? 抵触しそうな気が。


読むのであれば、Rnd 関数や System.Random を逆コンパイルするのではなく、
せめて Microsoft Shared Source CLI 2.0 の
 sscli20\clr\src\bcl\system\random.cs
を読む程度にとどめておくべきかと。こちらなら無問題。
引用返信 編集キー/
■10720 / inTopicNo.8)  Re[6]: Rnd関数について
□投稿者/ カンタービレ (95回)-(2007/11/24(Sat) 15:20:13)
No10718 (魔界の仮面弁士 さん) に返信
> そういう話ではなく、そもそも仕様許諾契約書にて、
>  リバースエンジニアリング
>  逆コンパイル
>  逆アセンブル
> の禁止がうたわれていませんでしたっけ? 抵触しそうな気が。

http://www.microsoft.com/japan/msdn/netframework/downloads/sdk_eula.aspx
大変失礼いたしました。見てはいけませんね。
このツールを知ったきっかけが某M社の人だったのもあり、軽はずみでした。
引用返信 編集キー/
■10729 / inTopicNo.9)  Re[7]: Rnd関数について
□投稿者/ VBファン (2回)-(2007/11/24(Sat) 21:06:34)
No10720 (カンタービレ さん) に返信
結局Rnd関数は非公開でオープンソースではないということですね。
自分たちで作るとしたらかなり時間はかかりますができないことはないという
ことでよろしいのでしょうか?
ただ好奇心でどうなっているのかが知りたくて質問ました。
解決済み
引用返信 編集キー/
■10733 / inTopicNo.10)  Re[8]: Rnd関数について
□投稿者/ 魔界の仮面弁士 (533回)-(2007/11/24(Sat) 21:52:27)
No10729 (VBファン さん) に返信
> 結局Rnd関数は非公開でオープンソースではないということですね。

Microsoft.NET ではなく、Mono Project でも良いのであれば、
MonoBASIC 1.2.5 の Rnd 関数(Microsoft.VisualBasic.VBMath.Rnd メソッド)が、
オープンソースで提供されていますよ。実装方法は異なりますけれども。
# vbruntime/Microsoft.VisualBasic/Microsoft.VisualBasic/VBMath.vb を参照。

http://www.mono-project.com/Downloads


> 自分たちで作るとしたらかなり時間はかかりますができないことはないという
> ことでよろしいのでしょうか?
No10663 でれいさんが、
>> 伝統的に線形合同法になっています。
と書かれていますから、まずは『BASIC rnd 線形合同法』などのキーワードで
ネット上を探してみてください。
擬似コードが幾つか見つかるかと思いますよ。(同一実装では無いにしても)


> ただ好奇心でどうなっているのかが知りたくて質問ました。
Rnd の内部実装を知ることによって、何を得たいのでしょうか?
VBファンさんが、最終的に何を知りたいのかがわかりませんでした。

# 同様のものを組みたいから、アルゴリズムを知りたいという事なのか、
# Rnd 関数の動作に疑問を持ったので調べてみたいと思っているのか、など。
引用返信 編集キー/
■10734 / inTopicNo.11)  Re[9]: Rnd関数について
□投稿者/ VBファン (3回)-(2007/11/24(Sat) 21:57:58)
No10733 (魔界の仮面弁士 さん) に返信
> Rnd の内部実装を知ることによって、何を得たいのでしょうか?
> VBファンさんが、最終的に何を知りたいのかがわかりませんでした。
>
> # 同様のものを組みたいから、アルゴリズムを知りたいという事なのか、
> # Rnd 関数の動作に疑問を持ったので調べてみたいと思っているのか、など。

アルゴリズムを知りたかったというのが率直な気持ちです。
たいへん親切で丁寧なご説明に心より感謝申し上げます。
解決済み
引用返信 編集キー/
■10735 / inTopicNo.12)  Re[8]: Rnd関数について
□投稿者/ カンタービレ (98回)-(2007/11/24(Sat) 22:15:16)
No10729 (VBファン さん) に返信
> ■No10720 (カンタービレ さん) に返信
> 結局Rnd関数は非公開でオープンソースではないということですね。
> 自分たちで作るとしたらかなり時間はかかりますができないことはないという
> ことでよろしいのでしょうか?
> ただ好奇心でどうなっているのかが知りたくて質問ました。

http://ayusya.hp.infoseek.co.jp/AlgorithmRandom.html
例えばこの方は独自の乱数生成を30分で作ったそうデス。

解決済み
引用返信 編集キー/
■10743 / inTopicNo.13)  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という方法もあります。

引用返信 編集キー/
■10744 / inTopicNo.14)  Re[9]: Rnd関数について
□投稿者/ れい (241回)-(2007/11/25(Sun) 01:51:22)
2007/11/25(Sun) 01:53:23 編集(投稿者)

No10735 (カンタービレ さん) に返信
> http://ayusya.hp.infoseek.co.jp/AlgorithmRandom.html
> 例えばこの方は独自の乱数生成を30分で作ったそうデス。

一応つっこんでおくと。
独自アルゴリズムの乱数実装は使わないほうが良いと思います。

乱数の検証はなかなか大変です。
(DieHardテストなど有名なのがいくつかあります。)

一見うまく動いているように見えても、
統計処理をしてもOKなのか、前後の乱数に相関はないのか、
チェックすることはたくさんあり、検証は困難です。

多くの人に検証され、(問題があるならそれが衆知であって、)
実績があるのが良いと思います。
解決済み
引用返信 編集キー/
■10773 / inTopicNo.15)  Re[7]: Rnd関数について
□投稿者/ Tom Yama (30回)-(2007/11/25(Sun) 22:37:07)
No10743 (れい さん) に返信
> また脱線してしまいますが。
>
> で、わからないライブラリを使うためにミニマムコードとか作って振舞いを調べるわけですが、
> これってリバースエンジニアリングとも言えます。
えっ!そうなの?
リバースエンジニアリングを問題視しているのは、著作権法であって、特許法ではないのでは?
著作権法は、アイデアの保護はしない、のだから、
上記のような行為(他人のアイデアを推測して、剽窃する)は、
少なくとも、法的に問題がある行為としての、リバースエンジニアリングでは、ないのでは?

# 激しく、ツッコミ希望!
解決済み
引用返信 編集キー/
■10776 / inTopicNo.16)  Re[8]: Rnd関数について
□投稿者/ 中博俊 (1210回)-(2007/11/25(Sun) 23:16:08)
中博俊 さんの Web サイト
>>で、わからないライブラリを使うためにミニマムコードとか作って振舞いを調べるわけですが、
>>これってリバースエンジニアリングとも言えます。
> えっ!そうなの?

ちがいます。
Microsoftの提供しているソフトウェアの使用許諾上、マイクロソフトの提供しているバイナリをリバースしちゃだめってことです。

> リバースエンジニアリングを問題視しているのは、著作権法であって、特許法ではないのでは?

著作権法でも特許法でもなく、個別の使用許諾です。


引用返信 編集キー/
■10810 / inTopicNo.17)  Re[9]: Rnd関数について
□投稿者/ れい (245回)-(2007/11/27(Tue) 00:14:34)
No10776 (中博俊 さん) に返信
> >>で、わからないライブラリを使うためにミニマムコードとか作って振舞いを調べるわけですが、
> >>これってリバースエンジニアリングとも言えます。
>>えっ!そうなの?
>
> ちがいます。
> Microsoftの提供しているソフトウェアの使用許諾上、マイクロソフトの提供しているバイナリをリバースしちゃだめってことです。

この「ちがいます」は何を否定してるんでしょう?

私は「バイナリをリバースしちゃだめ」の「リバース」の定義範囲が不明だと思ってます。
例えば、「ある関数の引数に様々なパラメーターをいれて振舞いを調べ内部実装を探る」のも
広義では「リバースエンジニアリング」です。

>>リバースエンジニアリングを問題視しているのは、著作権法であって、特許法ではないのでは?
>
> 著作権法でも特許法でもなく、個別の使用許諾です。

使用許諾「契約」ですから民法です。
違反しても「契約違反」であって「違法」ではないです。
引用返信 編集キー/
■10814 / inTopicNo.18)  Re[10]: Rnd関数について
□投稿者/ 囚人 (242回)-(2007/11/27(Tue) 09:00:25)
使用許諾にどこまで書いているか知りませんが、クリーンルーム方式のリバースエンジニアリングは慣例的にやってもいいかなーって気がします。

でないと「〜互換」ってのが何もかも駄目になるような。
Intel 互換プロセッサ。Windows 互換 OS 。ヘルシオのようなもの。
引用返信 編集キー/
■10824 / inTopicNo.19)  Re[11]: Rnd関数について
□投稿者/ シャノン (225回)-(2007/11/27(Tue) 18:35:20)
ちなみに、何が何でもリバースしてはならないということはありません。
これはあくまで該当製品(.Net Framework、VisualStudio、Windows等)の利用を許諾する条件なのですから、それらを利用しないのであれば守る必要はありません。
また、知的財産権の侵害を目的としない等、実害が無いケースについても、このような強力な条項が有効なのかどうかは、過去の裁判例等を参考にする必要があるのではないでしょうか。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -