-1

ランダムに生成された数値で満たされたベクトルを取得しようとしていますが、実行するとソート後に 2 つの数値しか得られないという問題があります。

0 0 0 0 0 17 17 17

これは私のコードなので、私が間違っていることを教えてください

#include <iostream>
#include <random>
#include <functional>

using namespace std;
using namespace std::chrono;

class Rand_int {
public:

    Rand_int(int low, int high) :dist{low,high} {
        for (int i = 0; i < 100; i++)
            cout << "Generated: " << dist(re) << endl;
            num = dist(re); }
    int operator()() { return dist(re);}
    int getNum() const
    {
        return num;
    }
    bool operator()(int x) const
    {
        return (num <= x);
    }

private:
    default_random_engine re;
    uniform_int_distribution<> dist;
    int num;
};

int main()
{
    int n=10;
    vector<int> v(n);
    Rand_int rnd {0,20};   // make a uniform random number generator

    for (int i=0; i<n; i++)
    {
        vector<int>::iterator iter = find_if(v.begin(), v.end(), rnd);
        v.insert(iter, rnd.getNum());
    }

    for (vector<int>::const_iterator iter = v.begin(); iter != v.end(); iter++)
        cout << *iter << endl;
    return 0;
}
4

2 に答える 2

2
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>

int main() {
    std::default_random_engine re { std::random_device()() };
    std::uniform_int_distribution<int> dist;

    std::vector<int> v;

    for(int i=0; i!=10; ++i) {
        int r=dist(re);
        auto it=std::lower_bound(v.begin(), v.end(), r);
        v.insert(it, r);
    }
    std::copy(
        v.cbegin(), v.cend(),
        std::ostream_iterator<int>(std::cout, "\n")  
    );   

あなたのコードは不必要に混乱していました、上記を考慮してください。ベクトルはソートされているためlower_bound、O(n)ではなくO(log(n))に挿入する正しい場所を見つけるために使用できます。

于 2013-02-25T17:10:28.430 に答える
2

まず、空のベクターから始めます。

std::vector<int> v;

次に、現在の乱数ジェネレーターは1 つの数値Random_intのみを生成して保存します。必要なのは、更新可能な状態を持つ です。numRandom_int

class random_int_state{
public:
    random_int_state(int low, int high) : 
        re{/* Assignment 1 - use a suitable seed for the random generator.
            * maybe you could use a `time`stamp or a `random device`? */
          }, 
        dist{low,high}, 
        num(dist(re)) {}
    int getNum() const
    {
        return num;
    }
    bool operator()(int x) const
    {
        return (num <= x);
    }
    void nextState(){
        /* Assignment 2 - how do you create a new state? 
        ** what is the observable state of this object after all? */
    }

private:
    std::mt19937 re;
    std::uniform_int_distribution<int> dist;
    int num;
};

それ以外は、挿入ソートアルゴリズムは正常に機能します。プログラムの最初は空のままにしておくことを忘れないvectorでください。そうしないと、先行ゼロが取得されます。

この例ではまだコードが必要ですが、それは非常に簡単です。

于 2013-02-25T17:07:26.070 に答える