1

私は2つの配列を持っています:

array1( 'Apple',
        'Pear',
        'Banana',
        'Apricot',
        'Watermelon',
        'Peach',
        'Pineapple',
        'Strawberry',
        'Melon',
        'Pomegranate',
        'Oranges',
        'Tangerine' ); 

みかんのサイズええええええええええええええええええええええええええええええええええええええええええええええええええええええええ 私はそれを助けることができません。それは地獄のように面白かったです.. では、2 番目の配列に戻りましょう。

array2( 'Fruits On Table',
        'Fruits In Basket',
        'Fruits In Fridge' );

みかんのサイズのリスト、配列、または文字列を生成したい...

最初の配列を繰り返さずに、これらの配列の両方をランダムにマージできるもの。次のようになります。

Tangerine( 'Tangerine - Fruits In Fridge',
           'Apple - Fruits On Table',
           'Pear - Fruits In Basket',
           'Peach - Fruits In Fridge',
           'Apricot - Fruits On Table',
           'Oranges - Fruits In Basket',
           'Melon - Fruits In Fridge',
           'Watermelon - Fruits On Table',
           'Pineapple - Fruits On Table',
           'Pomegranate - Fruits In Basket',
           'Strawberry - Fruits In Fridge',
           'Banana - Fruits In Basket' ); 

注意深く見ると、両方の配列からランダムに選択され、最初の配列を繰り返さずにマージされます..

では、C++でこれを行うにはどうすればよいですか? 私はC++の初心者です

また、それについての小さなアルゴリズムもいいでしょう。

4

5 に答える 5

4

最初の配列の要素にrandom_shuffleを適用できます。次に、それらをループして、2番目の配列からランダムな要素を取得します。たとえば、uniform_int_distributionを使用して、0、1、2の乱数分布を生成できます。または、2番目の配列要素のランダム化を省略し、それらを順番に選択してから、出力をシャッフルすることもできます。

于 2012-04-19T13:59:45.033 に答える
1

実生活で誰かがするように、あなたはそれをすることができます. 配列をランダムに選択するバッグのように扱い、選択ごとにアイテムを削除できます。そんな風に二度も摘むなんてありえない!また、元の配列を損傷したくない場合は、コピーを作成してそれを「バッグ」として使用できます...

もちろん、そのようなことを単純に行うと、多くのパフォーマンス上の問題があります。

ランダムな要素を取得して削除する

std::setでランダムな要素を選択するには?

...しかし、それらが何であり、なぜそれらを避けるべきかを理解していない場合、StackOverflowers によって提示された洗練されたシャッフル ソリューションに直接ジャンプすることは、少し...疑わしいように思えます。:-)

于 2012-04-19T14:05:21.833 に答える
1

0 から までの数値のフィッシャー・イェーツ シャッフルを実装できますN。ここNで、 は のアイテムの数です。次に、 のアイテムを のランダムなアイテムとarray1組み合わせます。array1[fyPermutation[i]]array2

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <list>
#include <sstream>
#include <iostream>
#include <bitset>
#include <ctype.h>

using namespace std;

const char *array1[] = {
    "Apple", "Pear", "Banana",  "Apricot",
    "Watermelon", "Peach", "Pineapple", "Strawberry",
    "Melon", "Pomegranate", "Oranges", "Tangerine"
};

const char *array2[] = {
    "Fruits On Table", "Fruits In Basket", "Fruits In Fridge"
};

vector<int> random_permutation(int n) {
    vector<int> p(n);
    for (int i = 0; i < n; ++i) {
        int j = rand() % (i + 1);
        p[i] = p[j];
        p[j] = i;
    }
    return p;
}

int main(int argc, const char* argv[]) {
    size_t N1 = sizeof(array1)/sizeof(array1[0]);
    size_t N2 = sizeof(array2)/sizeof(array2[0]);
    vector<int> perm = random_permutation(N1);
    vector<string> res;
    for(int i=0 ; i != N1 ; i++) {
        res.push_back(array1[perm[i]] + string(" - ") + array2[rand() % N2]);
    }
    for(int i=0 ; i != res.size() ; i++) {
        cout << res[i] << endl;
    }
    return 0;
}
于 2012-04-19T13:56:53.833 に答える
1

std::map最初の配列の文字列をキーとして、結合された文字列を値として使用することができます。ランダマイザーが既に使用したものと同じ果物で文字列を作成したとしても、それはマップ内のその果物の 1 つにすぎません。

マップ内のエントリの数が果物の数と同じになるまでこれを行うと、すべての果物があります。

于 2012-04-19T13:55:07.703 に答える
1

array1 の各文字列を効率的にシャッフルできるものが必要です。これはポインタになるので、array1 の文字列ごとに 1 つ作成し、それらを配列に格納します。sizeof(array1) ポインタを保持するには、配列を正しいサイズに malloc() する必要があります。

ポインターの配列をランダムにシャッフルすることは、Google で簡単に検索できる一般的なアルゴリズムです。基本的に、最初の要素を取得し、その上からランダムな要素と交換してから、2 番目の要素で同じことを行います....

次に、array1 文字列への char* のランダムな配列があり、繰り返しはありません。

シャッフル後、シャッフルされた char* 配列を反復処理し、シャッフルされた文字列をランダムに選択された array2 文字列と連結して出力​​文字列を組み立てます (別の関数を使用して char* をランダムに返すこともできます)。 array2 文字列)。何かを strcatting する前に、ヌル文字を含む出力を保持するために適切な量のスペースを割り当てるように注意してください!

ほら!今それを行います。

完了したら、忘れずに dispose() を行ってください。

于 2012-04-19T14:19:40.947 に答える