0

私はC++11のランダムなものを学ぼうとしているので、stackoverflowでここにあるこのサイトから例をコピーしました...

ここで達成したいのは、std :: xor_combineテンプレートを使用して、2つのエンジンを結合し、3番目のエンジンで初期化することです。link aboweによると、これは可能であるはずですが、Tr1レポート以降、ここでいくつかの変更が行われているようです。

また、以下のコードで指数分散オブジェクトを設定します。もう1つの質問は、xor_combine lobjectをディストリビューションと組み合わせて、「combin」をディストリビューションoperator()に渡す方法です。

Visual Studioで、次のコードで説明されているエラーが発生します...

#include<iostream>
#include<random>
#include<ctime>
using namespace std;

int main()

{
    minstd_rand gen1;
    mt19937 gen2;
    linear_congruential_engine<unsigned long, 34999, 0, 3405989> seeder;

seeder.seed(static_cast<unsigned long>(time(false)));
xor_combine<minstd_rand, 4, mt19937, 9> combin;

exponential_distribution<float> expdist(2);

combin.seed(seeder);

// generate numbers
for(int i = 0; i < 10; ++i)     // error in <random> 
    cout << combin() << endl; // ERROR  C:2039 generate is not a member of std::congruential_engine<...> etc... 

cin.get();
    return 0;
}

1. 3番目のエンジンをxor_combineオブジェクトに渡すにはどうすればよいですか?

2. xor_combineオブジェクトを配布オブジェクトにパスするにはどうすればよいですか? *編集*

#include<iostream>
#include<random>
#include<ctime>
int main()
{
    std::minstd_rand gen1;
    std::mt19937 gen2;
    std::xor_combine<std::minstd_rand, 3, std::mt19937, 6> combin(gen1, gen2);
    std::uniform_int_distribution<unsigned int> dist(0,37);
    combin.seed(static_cast<unsigned int>(time(0)));
    std::cout << dist( combin ) << std::endl;
    std::cin.get();
    return 0;
}

エラー1エラーC2352:'std :: xor_combine <_Engine1、_S1、_Engine2、_S2> :: max':非静的メンバー関数c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \include\の不正な呼び出しxutility 3455 Project1 1

4

1 に答える 1

2

std::xor_combineC++11には存在しません。Library DefectReport789の解決策として削除されました。

物議を醸す。ビルは正しいですが、Fermilabは、これは使い勝手が悪く、正しく使いにくいと考えているため、完全に削除する必要があります。明確に定義されたルートでTR1に入りましたが、削除する権限はありますか?彼が創始者であると信じられているので、おそらくイェンスに確認する必要があります。これは堅牢なエンジンアダプターではないという幅広いコンセンサス。

MSDNは実際の標準への参照ではありません。現在のCまたはC++標準ドキュメントはどこにありますか?を参照してください。標準を取得する方法に。


あなたの「生成はメンバーではありません」の問題は

combin.seed(seeder);

効果的に呼び出す

combin.base1().seed(seeder); // ignoring the const-ref
combin.base2().seed(seeder);

TR1では、乱数ジェネレーターを別の乱数ジェネレーターでシードできます(n1836表16)。ただし、C ++ 11では、代わりに「シードシーケンス」によって乱数ジェネレーターをシードする必要があります(n3290§26.5.1.2、変更がいつ導入されるかはわかりません)。C ++ 11には、呼び出し時にRNGまたはシードシーケンスのどちらであるかを確認する概念がないseederため、テンプレートのインスタンス化ではシードシーケンスであると想定されますseeder。「シードシーケンス」の要件の1つは、.generateメンバー関数(n3290表115)を持つことです。これが、コンパイラエラーが発生した理由です。

「シードシーケンス」の概念を知らないTR1エンジンを使用してこれを解決しようとするか、RNGを入力イテレータにラップしてからにラップするstd::seed_seqか、または単に数値をシードすることができます。

unsigned long seed = ....;
combin.seed(seed);

そして最後の2つの質問について:

  1. XORは連想的であることに注意してください。つまり、あなたはただ使うことができます

    xor_combine<RNGa, sa, xor_combine<RNGb, sb, RNGc, sc>, 0>
    

    3つのエンジンを組み合わせる

  2. xor_combine他のすべてのRNGと同様に、オブジェクトをディストリビューションに渡します。

    std::uniform_int_distribution<> d(0, 10);
    std::cout << d(combin) << std::endl;
    
于 2012-04-29T08:29:16.277 に答える