[過去ログ] スレ立てるまでもない質問はここで 159匹目 (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
824(2): デフォルトの名無しさん [sage] 2022/04/24(日) 10:19:01.79 ID:xiKS/a+r(1/3) AAS
基本は
確率配列をすべて足して[合計]を作る(600万個あったらintの範囲を超えるかもしれないねえ)
0〜[合計]-1までの[乱数]を発生
[乱数]から確率配列を頭から順に引いていく
0以下になったらそこのインデックスが答え
829: 814 [sage] 2022/04/24(日) 14:38:00.55 ID:/ngwo9iT(1) AAS
>>815815(2): デフォルトの名無しさん [sage] 2022/04/24(日) 09:02:39.39 ID:zr61OZd6(1/2) AAS
割合関係なく普通の乱数発生させる。範囲は0〜配列の要素数-1
そして得られた乱数をインデックスとしてその配列の要素を結果を返す
>>817-818
>>822-824
ありがとうございます。説明がわかりづらかったかもしれません。
ある一つの箱の中に1から600万までの数字の書かれた玉が入っていて、
1の書かれた玉が300個、2の書かれた玉が150個、3の書かれた玉が100個・・・という風にそれぞれの個数が異なって入っています
この箱の中から玉を一個だけ無作為に抽出したいといった感じです。
とりあえず試してみます
あと途中でレスしてるのは自分じゃないです
830: デフォルトの名無しさん [sage] 2022/04/24(日) 15:07:02.59 ID:rPlVOsWU(2/2) AAS
それはWeighted Random Samplingという問題で
>>824 >>818818(2): デフォルトの名無しさん [sage] 2022/04/24(日) 10:03:30.75 ID:qAz5Hesd(1/2) AAS
こんな感じでいける?
var numbers = new int[] { 0, 300, 150, 100, 80 };
var sums = new int[numbers.Length];
for (int i = 0, sum = 0; i < numbers.Length; i++)
sums[i] = (sum += numbers[i]);
int v = new Random().Next(sums[sums.Length - 1]) + 1;
int ok = sums.Length - 1, ng = -1;
while (ok - ng > 1)
{
int mid = (ok + ng) / 2;
if (sums[mid] >= v) ok = mid;
else ng = mid;
}
Console.WriteLine(ok + 1);
(二分探索で高速化), >>826 (ワンパス)
で解けます
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.045s