C#, C♯, C#相談室 Part86 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2014/12/27(土) 00:37:39.56ID:CxSn36ZMhttp://www.visualstudio.com/downloads/
■コードを貼る場合はこちら
http://ideone.com/
■前スレ
C#, C♯, C#相談室 Part85
http://peace.2ch.net/test/read.cgi/tech/1412298752/
■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
0153デフォルトの名無しさん
2015/01/06(火) 03:41:49.07ID:lXgSl7Koそれなら、List<Interface>で良いんじゃ。
0154デフォルトの名無しさん
2015/01/06(火) 06:50:09.33ID:Gue0XuXVそれだと入れられなくないか?
0155デフォルトの名無しさん
2015/01/06(火) 10:00:22.93ID:tMvZ7xD7これ結構早い段階というか最初から?偏りがあるんじゃないかって疑ってたみたいだけど、そういうのってなんとなく?感覚的に?あるいは論理的に?分かるもんなの?
なんにしても、なんとなく適当にやると簡単に偏りとか出てしまうんだな。
0156デフォルトの名無しさん
2015/01/06(火) 10:23:55.04ID:IQcBbcwX0157デフォルトの名無しさん
2015/01/06(火) 12:36:40.69ID:M5IoxY0a・OrderByは安定ソートである
この2点さえ知ってれば明らかでしょ
安定ソートでないアルゴリズムでも重複キーの順序は大抵何らかの単純な法則に従うから偏るだろうね
>>136はNext(i, array.Length)に変えたら一様になるよ
インプレースだから分かりらさ
0158デフォルトの名無しさん
2015/01/06(火) 12:38:49.14ID:M5IoxY0aインプレースだから分かりにくいけど、直感的には袋に入れた玉を無作為に取り出して並べるのと等価
0159デフォルトの名無しさん
2015/01/06(火) 12:52:09.52ID:RdEZdnsU0160デフォルトの名無しさん
2015/01/06(火) 13:05:59.44ID:IQcBbcwX理解せずに無視してるとなるとそれは
0161デフォルトの名無しさん
2015/01/06(火) 13:10:43.51ID:9BIJAN3Y等価に思えんけど。
それではインデックスが若い物ほどSwapされる頻度の平均値が上がってしまう。
0162デフォルトの名無しさん
2015/01/06(火) 13:13:38.84ID:IQcBbcwX0163デフォルトの名無しさん
2015/01/06(火) 14:53:07.88ID:nsrYhV9A>Next(i, array.Length)に変えたら一様になるよ
全く意味不明だな
元がどう一様ではないのか説明してみろよ
0164デフォルトの名無しさん
2015/01/06(火) 14:59:54.65ID:3sTwSoyeでそれは>>158の解釈通りでしょ
0165デフォルトの名無しさん
2015/01/06(火) 15:01:16.62ID:3sTwSoye0166デフォルトの名無しさん
2015/01/06(火) 15:02:50.44ID:9BIJAN3Y0167デフォルトの名無しさん
2015/01/06(火) 15:07:35.47ID:A5fXnf9Kやってることはスワップなんだが、論理的には袋の中から一つずつランダムに取り出すのと同じになるんだよ、>>158のやり方で。
よく考えれば分かる。
最初のやり方は一様にならない。
0168デフォルトの名無しさん
2015/01/06(火) 15:09:36.32ID:3sTwSoyeどういうこと?157のように変えたらarray[0]は初回のみしかswapされないと思うんだが
0169デフォルトの名無しさん
2015/01/06(火) 15:09:40.81ID:nsrYhV9A元が一様ならばNext(i, array.Length)にするのは無駄な処理が増えるしシンプルさを損なうから無粋だろう
0170デフォルトの名無しさん
2015/01/06(火) 15:10:38.19ID:A5fXnf9Kスワップする事で、袋から選んだボールを並べた上で、選ばなかったボールを袋に返してることになるんだよ。
ちょっとわかりにくいけどよく考えてみれば分かるはず。
0171デフォルトの名無しさん
2015/01/06(火) 15:12:21.30ID:A5fXnf9Kスワップじゃなくて、袋から一つずつ取り出してるんだ。
一回取り出した奴を含めて選びなおしてたらおかしくなるだろ?
0172デフォルトの名無しさん
2015/01/06(火) 15:17:05.25ID:nsrYhV9Aボールを袋に返すっていうのがまず意味不明だし
袋に返すとどう一様じゃなくなるのかも分からんな
0173デフォルトの名無しさん
2015/01/06(火) 15:17:15.48ID:9BIJAN3Yだから、初期状態の位置によって何度も袋に戻される玉とそうでない玉が出るんだから全然等価じゃありません。
0174デフォルトの名無しさん
2015/01/06(火) 15:21:19.22ID:9BIJAN3YSwap(0, 1)→Swap(1, 2)→Swap(2, 3)→Swap(3, 4)
と最大4回swapされる可能性があるが、初期状態でarray[4]に入ってる値は
最大でも1回だけ。
0175デフォルトの名無しさん
2015/01/06(火) 15:22:15.54ID:nsrYhV9A現実のボールを袋から取り出してるわけではないからそのメタファーに従う必要はない
別にボールを取り出すようにやらないと配列が一様なランダム性を得られないわけではないし
さらにいえばボールを袋に返してはいけないのは並べ終わらなくなるからであって一様性とは関係ないはずだ
0176デフォルトの名無しさん
2015/01/06(火) 15:27:31.97ID:A5fXnf9K例えばボール3つの場合、ボールの並び方は
123 132 213 231 312 321
の6パターンになる。
一方、スワップの組み合わせ数は3×3×3で27パターン。
つまり6パターンで割り切れない。
ということは、どういうことになるかというと、パターン数に偏りがあるって事になる。
分かる?
0177デフォルトの名無しさん
2015/01/06(火) 15:30:16.08ID:A5fXnf9K違うよ。
プログラムの動作をメタファーで表現してるのではなくて、元々の袋から一つずつ取り出して並べる操作を、プログラムでシンプルに実装するとこうなるんだ。
論理的に等価なんだよ。
0178デフォルトの名無しさん
2015/01/06(火) 15:31:51.57ID:9BIJAN3Y0179デフォルトの名無しさん
2015/01/06(火) 15:34:02.23ID:A5fXnf9K一方で、>>157のやり方だと、スワップの組み合わせ数は
3×2×1で6パターン
つまりボールの並び順のパターン数と同じになる。
袋から一つずつ取り出して並べるのと等価になるようにプログラムしてるんだから当然だけど。
0180デフォルトの名無しさん
2015/01/06(火) 15:35:29.20ID:nsrYhV9Aまずスワップの組み合わせ数とボールの並べ方の数に何の関係があるんだよ
関係無いものを並べてみただけのただの詭弁だ
ランダム性が一様であるかどうかは「配列のすべてのインデックスで、
全ての項目から均等な確率で一つが選ばれて割り当てられているかどうか」で決まる
だから>>136は全く正しいアルゴリズムである
0181デフォルトの名無しさん
2015/01/06(火) 15:40:01.80ID:A5fXnf9Kまず一回目のループで3つのうちどれか選ぶよな。
それが一つ目のボールだ。
配列の1つめと、選んだボールをスワップする。
配列の1つは選んだボールになり、2つ目と3つ目は袋に残ったボールになる。
2回目のループで配列の2つ目と3つ目どちらかを選ぶ。
つまり、袋に残った2つのどちらかを選ぶ。
配列の2つ目と入れ替える。
配列の2つめは、袋から2回目に選んだボールとなり、配列の3つ目には選ばれなかったボールが残る。
こういう事だよ。
0182デフォルトの名無しさん
2015/01/06(火) 15:43:07.32ID:A5fXnf9Kさすがに
確率を勉強し直せとしか言えん。
スワップのパターン数=出来上がる配列の最終的なパターンの総数だろうが。
その総数が、並び方のパターン数の倍数にならないなら、並び方によって出現するパターン数が替わってしまう=一様になってない。
何で分からん?
0183デフォルトの名無しさん
2015/01/06(火) 15:43:43.21ID:IQcBbcwX0184デフォルトの名無しさん
2015/01/06(火) 15:46:15.23ID:3sTwSoye>>157だと偏ってないように見えた
ちょっと確率の計算を勉強しなおしてくる
0185デフォルトの名無しさん
2015/01/06(火) 15:51:38.69ID:IQcBbcwX0186デフォルトの名無しさん
2015/01/06(火) 15:57:49.21ID:3sTwSoye0187デフォルトの名無しさん
2015/01/06(火) 16:04:24.60ID:3sTwSoye合ってるよね?
0188デフォルトの名無しさん
2015/01/06(火) 16:04:38.57ID:9BIJAN3Ya[i]からa[n]までの部分配列を袋とみなして玉を取り出した後、袋とみなす部分配列の始点を
インクリメントするのと同じだから、やっぱり>>157-158が正しいなw
すまんかった。
0189デフォルトの名無しさん
2015/01/06(火) 16:22:27.74ID:W2F4pWSu俺はやらないけどな
0190デフォルトの名無しさん
2015/01/06(火) 16:41:32.07ID:A5fXnf9K合ってる。
0191デフォルトの名無しさん
2015/01/06(火) 16:41:49.09ID:3sTwSoyehttp://ideone.com/Uic7zf
0192デフォルトの名無しさん
2015/01/06(火) 18:03:02.39ID:GG94B219実際どの程度偏ってるんだろ
0193デフォルトの名無しさん
2015/01/06(火) 18:17:27.51ID:fNWhMhIPCのデフォRand()がアレなのは常識だけど、C#デフォのはどうなの?
メルセンヌ・ツイスタとかなら文句はないんだが
0194デフォルトの名無しさん
2015/01/06(火) 18:21:06.20ID:W2F4pWSu0195デフォルトの名無しさん
2015/01/06(火) 18:27:12.50ID:pqQorvDTうん。
0196デフォルトの名無しさん
2015/01/06(火) 18:29:24.17ID:pqQorvDT>>184
ジワジワくるw
息してないけど。
0197デフォルトの名無しさん
2015/01/06(火) 18:30:35.79ID:pqQorvDT0198デフォルトの名無しさん
2015/01/06(火) 18:32:22.80ID:nsrYhV9A>スワップのパターン数=出来上がる配列の最終的なパターンの総数
何言ってんだ一体
たとえば同じ箇所を二回スワップすれば同じパターンに戻るんだからスワップの総数は最終的なパターンの総数になんかなるわけないだろう
たしかに俺が間違っていたことは間違いないが
これが詭弁なことにも違いはない
>>191の結果を見ると
結局最初に0番にスワップされた奴はもう戻って来られない可能性が高いが
0は自由な位置に移動した後もう一度必ず移動するチャンスがあるので
その分移動しやすいってことか
なので自分の数字より若い位置に移動したらもう移動しない可能性が高いので
自分の数字より前の濃度が高くなるのか
0199デフォルトの名無しさん
2015/01/06(火) 18:42:43.31ID:pqQorvDTだから確率を勉強しし直すといいよ。
同様に確からしい起こりうる事象のすべての組み合わせのうち、
ある事象が起こる回数の割合が、その事象の起こる確率だ。
同様に確からしい、起こり得るすべての事象の総数がここでは27パターンなわけ。
この27パターンは同じ確率で発生するわけ。
並び方のパターンは6で、総事象が27ってことは、確実に多い並びと少ない並びがあるわけ。
27パターンは同じ確率で発生するんだから、少ない並びのパターンが発生する確率は少なくなるわけ。
確率を分かってたら総パターンの意味なんてすぐ分かるけど、ちゃんと理解してないからピンと来ないんだな。
0200デフォルトの名無しさん
2015/01/06(火) 18:45:28.69ID:pqQorvDT詭弁でもなんでもなくて、確率の話ではふつうの言い方だよ。
理解できないおまえがアホなだけ。
結局お前の言ってたこと全部間違ってるじゃんw
0201デフォルトの名無しさん
2015/01/06(火) 18:52:03.53ID:W2F4pWSu0202デフォルトの名無しさん
2015/01/06(火) 19:15:40.97ID:nsrYhV9A現象を理解してないから詭弁を使うわけ
俺は現象を理解したから無意味な詭弁で妙な説明をする必要はなくなったの
そしてお前は煽ってるだけで最初からなんにも理解できてないわけ
確率の上っ面を舐めて変な解説に屋上屋を重ねただけ 現象には全く届いていない
0203デフォルトの名無しさん
2015/01/06(火) 19:18:01.57ID:W2F4pWSuあと5時間もあるのよ?
0204デフォルトの名無しさん
2015/01/06(火) 19:59:29.97ID:d8xiUFfPおまえは何を言ってるんだ…
0205デフォルトの名無しさん
2015/01/06(火) 20:06:27.17ID:Q7R46vB50206デフォルトの名無しさん
2015/01/06(火) 20:10:09.17ID:d8xiUFfP27の根元事象は、結果としてこの6事象はのいずれかに対応している。
偏りがないためには、結果の6事象が同じ確率で発生しなければならない。
しかし、根元事象が27なので、結果の6事象は均等に発生せず、6事象の発生確率は確実に異なる。
だから>>136は絶対に偏りが発生する。
それだけの話で、確率としては当たり前の話。
理解できない奴がアホ。
0207デフォルトの名無しさん
2015/01/06(火) 20:13:24.83ID:d8xiUFfP0208デフォルトの名無しさん
2015/01/06(火) 20:20:40.77ID:Q7R46vB5これがidentifyのあるコミュニティだったらユーザー封印レベルだった
0209デフォルトの名無しさん
2015/01/06(火) 21:11:12.98ID:qlHRI5QUつまりこういうことか。
https://ideone.com/crwsk4
0210デフォルトの名無しさん
2015/01/06(火) 21:24:47.79ID:MYBQVLqU0211デフォルトの名無しさん
2015/01/06(火) 21:36:10.21ID:O9PzdG7T単純に大小比較で終わりそうな気もするがw
0212デフォルトの名無しさん
2015/01/06(火) 21:46:17.93ID:Z/uJ2lW6階乗って事は、n以下の前自然数が因数として含まれてるわけだ。
割り切れる訳ないよね?
証明できる。
準備:隣合う二つの整数は互いに素
証明:a, b, が d で割り切れるなら、差 a - b も d で割り切れる。(∵a = q1・d, b = q2・d とおくと a - b = d(q1 - q2))
a - b = 1 ならば、a, b, ともに割ることのできる 1より大きい整数は存在しない、もしあったら、a - b = 1 をわることができることになり矛盾。
>>210 の証明
素因数分解は一通りであることを仮定する(これは実はあたりまえじゃない)
n を素因数分解すると p1〜p(n) の m 種類の素数で構成されていたとする。このとき、 n^n も m 種類の素数で構成される。
ここで n >= p1・p2・...・p(n) 、そして、p1・p2・... p(n) とp1・p2・... p(n) - 1 は互いに素
すなわち n! を素因数分解すると p1, p2, ... p(n) のどれとも異なる素数を持つ
ゆえに、n^n は n! で割り切れない Q.E.D
0214デフォルトの名無しさん
2015/01/06(火) 22:23:51.73ID:qlHRI5QUn >= p1・p2・...・p(n)
じゃなくて、
n = p1・p2・...・p(m)
じゃないの?
0215デフォルトの名無しさん
2015/01/06(火) 22:28:02.85ID:uMZjRgvb0216デフォルトの名無しさん
2015/01/06(火) 22:30:35.81ID:nsrYhV9AC#もプログラムも一切関わりのないことをプログラム板のC#スレにズルズル書き込んでるんじゃない
0217デフォルトの名無しさん
2015/01/06(火) 22:39:13.30ID:Z/uJ2lW6とっとと失せろよ
0218デフォルトの名無しさん
2015/01/06(火) 22:47:05.72ID:3D6Su9d8ああ、m と n の使い分けがごちゃごちゃだ‥てきとーに読み替えて
>>216
ごめん
0219デフォルトの名無しさん
2015/01/06(火) 22:55:20.05ID:3sTwSoye自分も見直したけど、あなたも確率の考え方は見直しといた方が良いよ
たぶん何か勘違いしてる
0220デフォルトの名無しさん
2015/01/06(火) 23:01:15.45ID:Bc4EA3Wj搾取されるんですけどね
0221デフォルトの名無しさん
2015/01/06(火) 23:08:04.94ID:Q7R46vB50222デフォルトの名無しさん
2015/01/06(火) 23:16:03.06ID:/zWcLRCZ0223デフォルトの名無しさん
2015/01/06(火) 23:28:31.96ID:Q7R46vB50224デフォルトの名無しさん
2015/01/06(火) 23:59:07.16ID:fH0Fgns+0225デフォルトの名無しさん
2015/01/07(水) 00:03:39.74ID:kDJhAAzR一応、報告と、また低レベルな質問をしに来たのですが
今はやめた方がいい感じでしょうか?
0226デフォルトの名無しさん
2015/01/07(水) 00:04:29.36ID:dafMrNYgロジックを説明されても理解できないなら、せっかく>>209でコード書いて
実証したんだからそれ見て納得してよ。
0227デフォルトの名無しさん
2015/01/07(水) 00:05:35.11ID:dafMrNYg別にいいよ。
荒れたって死人がでるわけじゃない。
多少スレッドの見通しが悪くなるだけだ。
0228デフォルトの名無しさん
2015/01/07(水) 00:05:49.11ID:2DuSSq4qいや、むしろこの流れを変えて欲しい
0229デフォルトの名無しさん
2015/01/07(水) 00:15:10.63ID:kDJhAAzRまず、
・カード・タイプごとにクラスを切るのをやめた
・カード種類の判別は普通のintの数字のみにした
・int型のリストにランダムでカード種類を表す整数リテラルを入れ、それをシャッフルする
これでやりました
結果から言うと、やりたかった事は出来ました
また、シャッフル(ランダムにする)する処理は昨日一日調べたのですが
FisherYatesを最初使っていたのですが、もっと簡単にできるのがあるという記事を見つけて
FisherYatesをやめ、以下のように書きました。
private static void Fisher(int[] c)
{
int[] cardlist = c; //引数の配列を格納
// 1回じゃ偏りが生じるっぽいので念のため何度かシャッフルを繰り返す
for (int cnt = 0; cnt < 10; cnt++)
{
DeckList.cardlist = cardlist.OrderBy(i => Guid.NewGuid()).ToArray();
}
}
正直、このグイッドについてはあまり理解してないのですが、要するにOrderByというソートメソッドと
乱数を発生させるグイッドメソッドを組み合わせてランダムにインデックスの値をソートさせると認識しています
まず1点目にお聞きしたいのは、上記の処理は何か問題点を含んでいないでしょうか?という事です
ちなみに偏りについてですが、あまり起きないに越したことはないと思いますが、そこまで是が非でも
偏りを解消したいというわけでもないので、程々乱れてくれればいいという観点です。
0230デフォルトの名無しさん
2015/01/07(水) 00:15:59.95ID:PZkMwQ+l偏るって、どれだけ偏るんだよ
使い物にならないくらい偏るわけないだろ
シャッフル厨は死ねよ
0231デフォルトの名無しさん
2015/01/07(水) 00:17:03.97ID:kDJhAAzR・カード・タイプごとにクラスを切るのをやめた
・カード種類の判別は普通のintの数字のみにした
・カード種類をintで判定するようにしたので、ArrayListをやめてint配列にした(public static int[] cardlist = {・・・})
・int型のリストにランダムでカード種類を表す整数リテラルを入れ、それをシャッフルする
0232デフォルトの名無しさん
2015/01/07(水) 00:23:45.46ID:kDJhAAzR・int型の配列にランダムでカード種類を表す整数リテラルを入れ、それをシャッフルする
でした
0233デフォルトの名無しさん
2015/01/07(水) 00:24:43.11ID:qh26SAEn0234デフォルトの名無しさん
2015/01/07(水) 00:26:17.95ID:/xILHur90235デフォルトの名無しさん
2015/01/07(水) 00:29:02.69ID:BcMWINqr最初の、入門書も読んでるか怪しい、ど素人にもほどがある質問に比べて、
別人かのようなレベルだし。
コードも自分が納得する動きになっているんであればそれで十分かと。
0236デフォルトの名無しさん
2015/01/07(水) 00:35:27.18ID:GJGYE4EM0237デフォルトの名無しさん
2015/01/07(水) 00:39:17.83ID:+paEBoihシャッフルは FisherYatesが正解だよ。
GUIDでソートは簡単に書くのが目的であって、
わざわざ偏るからループまでするくらいなら FisherYatesでいい。
0238デフォルトの名無しさん
2015/01/07(水) 00:41:20.08ID:+paEBoihGUIDは別に質のいいランダムじゃないしね。
0239デフォルトの名無しさん
2015/01/07(水) 00:45:57.08ID:+paEBoihどう見ても自分に言ってる。
自分に言ってるなら違和感ない。
0240デフォルトの名無しさん
2015/01/07(水) 00:49:11.22ID:6g40PNLQ>>224みたいな人がゲームを作るとカルドセプトのようになる
>>191,209でせっかく実際に偏りを見せてくれてるのに
0241デフォルトの名無しさん
2015/01/07(水) 01:06:06.00ID:nug8jEZh偏ってるって言ったところで
なぜそれが偏るのか説明できなきゃ理解したことにはならないんだよ
逆に言えばなぜそれが偏るのか理解できないから
トンチンカンな説明をしだすってこと
0242デフォルトの名無しさん
2015/01/07(水) 01:19:30.07ID:6g40PNLQ0243デフォルトの名無しさん
2015/01/07(水) 01:26:30.11ID:kDJhAAzR質問するレベルじゃない気もしますし
あとシャッフルはGuidやめてFisherYatesにします
ありがとうございました。
0244デフォルトの名無しさん
2015/01/07(水) 01:31:14.45ID:nug8jEZhなぜ自分より若いインデックスの濃度が高まるのか説明できるか考えてみるといい
いかに頓珍漢な説明をしているか分かるだろう
0245デフォルトの名無しさん
2015/01/07(水) 07:13:52.16ID:AKPWQzMrトンチンカンは消えろって言ってんだよ
自覚ねえのか昨日の地球で人類最低ランキング一位のカス
0246デフォルトの名無しさん
2015/01/07(水) 07:14:44.59ID:+paEBoihやっぱり勝手に勘違いしてるんだな。
一様でないのはこういう理由で明らかと言ってるだけで、どう偏るかについては何も言ってないのに。
こういう理由で一様でないのは明らか。
→こういう風に偏る説明になってない、トンチンカンだ。
アホか。
0247デフォルトの名無しさん
2015/01/07(水) 07:20:08.78ID:+paEBoihしかも実例で偏るの見た後でしか偏るわけがないって言い張ってたくせにw
0248デフォルトの名無しさん
2015/01/07(水) 08:36:08.25ID:lse0FVq20249デフォルトの名無しさん
2015/01/07(水) 08:40:58.67ID:lse0FVq2198 デフォルトの名無しさん sage 2015/01/06(火) 18:32:22.80 ID:nsrYhV9A
>>191の結果を見ると
結局最初に0番にスワップされた奴はもう戻って来られない可能性が高いが
0は自由な位置に移動した後もう一度必ず移動するチャンスがあるので
その分移動しやすいってことか
なので自分の数字より若い位置に移動したらもう移動しない可能性が高いので
自分の数字より前の濃度が高くなるのか
これか。
ワロタ。
じゃあ何で可能性が低いどころか絶対に戻ってこれない>>157で偏らないんだよ。
0250デフォルトの名無しさん
2015/01/07(水) 09:20:24.53ID:pOoHqu3JTuple<string, string>
Tuple<string, string, sring>
Tuple<string, string, sring, sring>
これを1つのTableクラスが複数の種類のTupleを扱うためには
どういう形で持てばいいのでしょうか
Tupleの共通する基底クラスがあればいいのですが・・・あるいはインターフェース
0251デフォルトの名無しさん
2015/01/07(水) 10:09:33.54ID:NB6nt07Bいまひとつどういう事をしたいのか分からない…
sringってのはstringの間違い?
0252デフォルトの名無しさん
2015/01/07(水) 10:16:24.34ID:NB6nt07B>>244
>>249
ジワる
■ このスレッドは過去ログ倉庫に格納されています