問題タブ [boost-random]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - stdlib.h の rand はどれくらい悪いですか?
私は C++ でモンテカルロ シミュレーションを作成しており、乱数に Boost を使用していました。GSLも少し使いました。しかし、乱数生成は実行時の最大の非効率性の 1 つであることが判明したため、古き良きrand()
fromを使い始めましたcstdlib
。
シミュレーションの乱数特性が悪いと、どの程度のリスクがありますか? 約 10^6 または 10^7 の乱数サンプルを使用します。
c++ - C++でデフォルト以外のコンストラクターを使用してオブジェクトのメンバークラスを初期化する
ブースト乱数ジェネレーターを使用したいオブジェクトがあるという特定の状況があり、それは私が答えることができないより大きな質問につながりました。これが私が作成しようとしているもののサンプルコードです。
まず、私のヘッダー:
今私がしたいのは:
ただし、ヘッダーにあるため、これは機能しません。MyObjectのコンストラクターを使用して、さまざまなサブオブジェクト(ディストリビューション、ジェネレーター)のコンストラクターを呼び出すことができると思いましたが、方法がわかりません。MyObjectのコンストラクターが呼び出されるまでに、サブオブジェクトのデフォルトコンストラクターはすでに呼び出されていますが、これらのプロパティをリセットするためのメンバーメソッドがあることはわかりません...それ以外に、それは私が混乱しているポイントではありません。 m紛らわしい問題ですが、私が知る限り、私の問題は次のような幼稚な例になります。
これは他のすべての人にとって第二の性質であると確信していますが、オブジェクトのメンバーオブジェクトをデフォルト以外のコンストラクター値に初期化するためのベストプラクティスについて説明している記事は見つかりません。
c++ - std::vectorを使用してboost::random::discrete_distributionを初期化する方法は?
boost::random::discrete_distribution
で初期化したいと思いますstd::vector<double>
。
私の問題は、公式の例のように、配列で初期化すると次のようになることです。
その後、完全に機能します。
ただし、 で初期化すると、std::vector
確率 1.0 の要素が 1 つしかない場合のように動作します。
boost::random::discrete_distribution<>
ベクトルで aを初期化する正しい方法を教えてください。
c++ - ランダムにブースト::discrete_distribution構築されたウェイトを変更するにはどうすればよいですか?
OK、boost :: random::discrete_distributionで重み/確率を与えることは可能です。
例えば
二重確率[]={0.5、0.1、0.1、0.1、0.1、0.1};
boost :: random :: discrete_distribution <> dist(確率);
質問:オブジェクトdistが構築されたら
(1)重みの1つを0.5から0.3に変更するにはどうすればよいですか?
(2)すべての重みを一度に再割り当てするにはどうすればよいですか?
c++ - long double の (疑似) 乱数ジェネレーターにブーストを使用する
long double の乱数生成に boost を使用しようとしています (64 ビット マシン上)。
ある時点で私は使用します
ただし、コンパイラは、boost/random/mersenne_twister.hpp の 88 行目で、
64ビットを32ビット値に短縮する暗黙の変換があります...
ロングダブルとダブルのどちらが欲しいかさえ指定していませんでした...なぜ彼はそれについて議論しているのですか? 64ビットOSを使用しているからですか?
この問題の簡単な解決策はありますか? ロングダブルジェネレーターが必要です... xD
ありがとう
c++ - double[]を使用してboost::random::discrete_distributionを初期化する方法;
次のようにdouble[]を使用してboost::random::discrete_distributionを初期化します。
ベクトルまたは静的サイズのテーブルを使用できることは知っていますが、_distrを書き直さずにそれを克服する方法はありますか?
c++ - boost :: random :: discrete_distributionは動的にサイズ変更可能ですか?
ブーストバージョンのdiscrete_distributionのドキュメントがあまり見つかりません。多くのグーグル検索の後、私はまだこのクラスが持っているメソッドのリスト、そしてそれらのどれかが確率を再割り当てするために機能するかどうかさえ見つけることができません。
私の場合、私は進化的ダイナミクスアルゴリズムを書いています。各タイムステップで、集団のメンバーをランダムに選択して、死亡または繁殖させることができます。このため、離散分布内のエントリの総数は、ほぼすべての反復で変化します。
gillespie_dist
シミュレーションを開始する前に定義する、 (このギレスピーアルゴリズムを管理する離散分布)と呼ばれる単一のオブジェクトが必要です。しかし、各反復の終わりに、特定の値を変更したり、新しい値を追加したりするgillespie_dist
必要があります。具体的には、反復ごとにdiscrete_distributionの新しいインスタンスを作成したくありません。
このための良いアプローチは何ですか。オブジェクトに新しい値をプッシュする方法、特定のインデックスで分布の値を変更する方法、さらに良いことに、ここでdiscrete_distribution
説明したベクトルイテレータのアイデアを使用して分布全体を何らかの方法で「再初期化」する方法はありますか?
c++ - boost ::uniform_on_sphereの使用方法は?
単位球上のランダムな点を選択しようとしていますが、ブーストがまさにこれを行う分布を提供することがわかりました。しかし、私がそれを使おうとすると、生成された値はすべてですnan
。何が間違っているのかわかりませんが、教えていただけませんか?この小さなコードは、私がやろうとしていることを表しています。
出力は次のとおりです。
ad infinitum .. ..
c++ - boost::random でベクトルをシャッフルするときの問題
このコードを使用して、Fisher-Yates のランダム化アルゴリズムのバリエーションを使用してベクトルのランダム順列を生成しています (最初の要素から最後の要素に移動しますが、その逆ではありません)。boost::random::mt11213b
プログラムの開始時にシードされるプログラムで RNG をグローバルに使用しているgenerator.seed(time(NULL));
ため、ここではラッパーシングルトンを使用RandomNumber
しています。
いくつかの実験により、このアルゴリズムに問題がある可能性があると確信するようになりました。これは私がしたことです
- 長さ 100 の整数のベクトルを作成しました
- 最初の 75 個の要素と
0
最後の 25 個の要素を1
- 配列をシャッフルしました。
- リストから最初の 5 つの要素を取得し、それらを合計しました。
この手順を数千回繰り返しました(手動ではなくループを使用して:))毎回、新しいベクトルから始めました。次に、合計の算術平均を計算したところ0.98
、期待値の代わりに結果が得られました1.25
。
面白いことに、順序付けされたアルゴリズムではなく、同じアルゴリズムで 1 回シャッフルされたベクトルから始めると、結果は次のよう1.22
に増加し、反復ごとにベクトルを破棄せずに、もう一度シャッフルするだけで、結果は1.25
期待値です。
何が問題なのかわからない。アルゴリズムは健全に見えます。私が考えることができる唯一の問題は、シード段階と
ベクトルがシャッフルされる前に毎回呼び出される行 (おそらく、プログラムで一度だけ呼び出す必要がありますが、それはあまり意味がありません)
どんな助けでも大歓迎です!