タグ付けされた質問 「random」

このタグは、疑似ランダムか真にランダムかに関わらず、乱数とそのジェネレーターに関する質問に使用します。



4
新しいランダムライブラリがstd :: rand()よりも優れているのはなぜですか?
そこで、rand()は有害と見なされるという話を見て、単純なstd::rand()プラスモジュラスパラダイムよりも乱数生成のエンジン分布パラダイムを使用することを提唱しました。 しかし、私はstd::rand()直接の失敗を見たかったので、簡単な実験をしました: 基本的に、私は2つの機能を書いたgetRandNum_Old()とgetRandNum_New()それが使用して0から5までの間の乱数を生成std::rand()し、std::mt19937+std::uniform_int_distributionそれぞれ。 次に、「古い」方法を使用して960,000(6で割り切れる)の乱数を生成し、0〜5の数値の頻度を記録しました。次に、これらの周波数の標準偏差を計算しました。私が探しているのは、分布が本当に均一である場合に起こることになるので、可能な限り低い標準偏差です。 そのシミュレーションを1000回実行し、各シミュレーションの標準偏差を記録しました。また、ミリ秒単位でかかった時間を記録しました。 その後、まったく同じことを繰り返しましたが、今回は「新しい」方法で乱数を生成しました。 最後に、新旧両方の方法の標準偏差のリストの平均と標準偏差、および新旧両方の方法の時間のリストの平均と標準偏差を計算しました。 結果は次のとおりです。 [OLD WAY] Spread mean: 346.554406 std dev: 110.318361 Time Taken (ms) mean: 6.662910 std dev: 0.366301 [NEW WAY] Spread mean: 350.346792 std dev: 110.449190 Time Taken (ms) mean: 28.053907 std dev: 0.654964 驚いたことに、ロールの総広がりは両方の方法で同じでした。つまり、std::mt19937+std::uniform_int_distributionは単純なstd::rand()+よりも「均一」ではありませんでした%。私が行った別の観察は、新しいものは古い方法よりも約4倍遅いということでした。全体として、品質の向上がほとんどないのに、スピードに莫大なコストを払っていたように見えました。 私の実験には何らかの欠陥がありますか?それともstd::rand()、それほど悪くはなく、おそらくもっと良いのでしょうか? 参考までに、私が使用したコード全体を次に示します。 #include <cstdio> #include <random> #include <algorithm> #include …
82 c++  c++11  random 

6
Pythonでプログラム全体にランダムシードを設定する
私はかなり大きなプログラムを持っており、randomモジュールの関数をさまざまなファイルで使用しています。プログラムが常に同じ結果を返すように、ランダムシードを1か所に1回設定できるようにしたいと思います。それも達成できますpythonか?
82 python  random  seed 


11
0と1の間のスウィフトランダムフロート
Swiftで、0から1の間のランダムなフロートを取得しようとしていますが、型変換を機能させることができないようです。 func randomCGFloat() -> CGFloat { return CGFloat(arc4random()) / UINT32_MAX } 「CGFloat」は「UInt8」エラーに変換できません Xcode6を実行しています。

2
ベクトルをランダム化する方法
単純な1行のコマンドで、ベクトル内の番号の順序をランダムに再編成したいですか? 私の特定のベクトルVには、1から10までの値ごとに150のエントリがあります。 V <- rep(1:10, each=150)
81 r  vector  random  shuffle 

2
Pythonでの乱数の最終桁の分布
Pythonで0から9までのランダムな数字を生成するには、2つの明白な方法があります。0と1の間のランダムな浮動小数点数を生成し、10を掛け、切り捨てることができます。あるいは、このrandom.randint方法を使用することもできます。 import random def random_digit_1(): return int(10 * random.random()) def random_digit_2(): return random.randint(0, 9) 0から1までの乱数を生成し、最後の桁を保持した場合にどうなるかについて知りました。分布が均一であるとは必ずしも思っていませんでしたが、結果はかなり驚くべきものでした。 from random import random, seed from collections import Counter seed(0) counts = Counter(int(str(random())[-1]) for _ in range(1_000_000)) print(counts) 出力: Counter({1: 84206, 5: 130245, 3: 119433, 6: 129835, 8: 101488, 2: 100861, 9: 84796, 4: 129088, …
24 python  random 

2
実際に実際に使用する必要がある<random>の乱数エンジンはどれですか?std :: mt19937?
C ++ &lt;random&gt;機能を実用的なプログラムで使用するとします(「実用的」の定義については、ここでの制約はこの質問の一部です)。おおよそ次のようなコードがあります。 int main(int argc, char **argv) { int seed = get_user_provided_seed_value(argc, argv); if (seed == 0) seed = std::random_device()(); ENGINE g(seed); // TODO: proper seeding? go_on_and_use(g); } 私の質問は、あなたはどのタイプを使うべきですENGINEか? 私はいつもstd::mt19937タイプするのが速くて名前認識があったのでいつも言っていました。しかし最近では、みんなが言っているように、メルセンヌツイスターは非常にヘビー級でキャッシュに不向きで、他の人が行うすべての統計的検定にさえ合格していません。 std::default_random_engineそれは明らかな「デフォルト」なので言いたいのですが。しかし、それはプラットフォームによって異なりあれば、私にはわからない、とそれは統計的にどんな良いことだかどうかはわかりません。 最近は誰もが64ビットプラットフォームを使用std::mt19937_64しているので、少なくともover を使用する必要がありstd::mt19937ますか? 私が言いたいpcg64かxoroshiro128、彼らは尊敬と軽量に見えるので、彼らは内に存在しない&lt;random&gt;すべてで。 私は約何も知らないminstd_rand、minstd_rand0、ranlux24、knuth_b確かに彼らは何のために良いことがあります- 、など? 明らかに、ここにはいくつかの競合する制約があります。 エンジンの強さ。(&lt;random&gt;暗号的に強力なPRNGはありませんが、一部の標準化されたものは他のものよりも「弱い」ですよね?) sizeof そのエンジン。 その速度operator()。 播種のしやすさ。mt19937初期化する状態が非常に多いため、適切にシードするのが難しいことで有名です。 ライブラリベンダー間の移植性。あるベンダーfoo_engineが別のベンダーとは異なる数値を生成する場合foo_engine、それは一部のアプリケーションには適していません。(うまくいけば、これは多分それ以外を除外しませんdefault_random_engine。) これらすべての制約をできる限り考慮して、究極の「標準ライブラリ内にとどまるベストプラクティス」の答えは何でしょうか。を使い続けるべきstd::mt19937ですか、それとも何ですか?
21 c++  c++11  random 

5
特定の合計または平均を持つ範囲でN個のランダムな整数を生成する効率的な方法はありますか?
N個の整数のランダムな組み合わせを生成する効率的な方法はありますか? 各整数は区間[ min、max]にあり、 整数の合計はsum、 整数は任意の順序(たとえば、ランダムな順序)で表示できます。 組み合わせは、他の要件を満たすすべての組み合わせの中からランダムに均一に選択されていますか? ランダムな組み合わせに対して同様のアルゴリズムがあり、整数は値によってソートされた順序で(順序ではなく)表示される必要がありますか? (平均の適切な組み合わせを選択することmeanは特殊なケースですsum = N * mean。の場合。この問題はsum、間隔[ min、max]にあり、任意の順序または並べ替えられた順序で表示されるN個の部分に均一なランダムパーティションを生成するのと同じです。場合によっては値)。 この問題は、ランダムな順序で現れる組み合わせに対して次の方法で解決できることを認識しています(編集[4月27日]:アルゴリズムが変更されました)。 N * max &lt; sumまたはの場合N * min &gt; sum、解決策はありません。 の場合N * max == sum、すべてのN数値がに等しいソリューションが1つだけ存在しmaxます。の場合N * min == sum、すべてのN数値がに等しいソリューションが1つだけ存在しminます。 SmithとTrombleで指定されたアルゴリズム(「単位シンプレックスからのサンプリング」、2004)を使用して、合計でN個のランダムな非負の整数を生成しsum - N * minます。 minこの方法で生成された各数値に追加します。 いずれかの数値がより大きい場合はmax、手順3に進みます。 ただし、maxがより小さい場合、このアルゴリズムは遅くなりsumます。たとえば、私のテストによれば(上記の特殊なケースの実装を伴うmean)、アルゴリズムは平均して拒否します— の場合N = 7, min = 3, max = 10, sum …

1
Rの「サンプル」関数のベンチマーク
私はsampleRで関数をベンチマークし、それを比較igraph:sample_seqして、奇妙な結果に出会いました。 私が次のようなものを実行すると: library(microbenchmark) library(igraph) set.seed(1234) N &lt;- 55^4 M &lt;- 500 (mbm &lt;- microbenchmark(v1 = {sample(N,M)}, v2 = {igraph::sample_seq(1,N,M)}, times=50)) 私はこのような結果を得ます: Unit: microseconds expr min lq mean median uq max neval v1 21551.475 22655.996 26966.22166 23748.2555 28340.974 47566.237 50 v2 32.873 37.952 82.85238 81.7675 96.141 358.277 50 でも走ると例えば set.seed(1234) N …
11 r  random 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.