2017-05-31 7 views
-3

Ich habe einen Std :: Vektor mit fester Größe N = 5. Ich möchte, dass jedes Element des Vektors zufällig zwischen zwei positiven Zahlen, insbesondere 1 und 12, ausgewählt wird. (Nullen sind nicht erlaubt). Jedes Element sollte auf dem Vektor eindeutig sein.C++ Vektor mit zufälligen eindeutigen Elementen mit konstanter Summe

Wie kann ich das tun? Die Implementierung ermöglicht bisher, dass Elemente null sind und Duplikate im Vektor enthalten sind. Ich möchte verbessern, um nicht Nullen zu ermöglichen und Duplikate

-Code bisher:

#include <algorithm> 
#include <array> 
#include <iostream> 
#include <iterator> 
#include <random> 

int main() { 
    std::random_device rd; 
    std::mt19937 gen(rd()); 

    constexpr int MAX = 20; 
    constexpr int LINES = 5; 

    int sum{}; 
    int maxNum = 12; 
    int minNum = 1; 

    std::array<int, LINES> nums; 

    for (int i = 0; i < LINES; ++i) { 
     maxNum = std::min(maxNum, MAX - sum); 
     minNum = std::min(maxNum, std::max(minNum, MAX - maxNum * (LINES - i))); 
     std::cout << minNum << " " << maxNum << std::endl; 
     std::uniform_int_distribution<> dist(minNum, maxNum); 
     int num = dist(gen); 

     nums[i] = num; 
     sum += num; 
    } 

    std::shuffle(std::begin(nums), std::end(nums), gen); 
    std::copy(std::begin(nums), std::end(nums), std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl; 
} 
+0

@ FrançoisAndrieux, wahr ich den alten Thread w/o es Kopie eingefügt. Jetzt ist meine Frage bearbeitet. Vielen Dank. – cateof

+1

Löschen und erneutes Veröffentlichen von Fragen zum Umgehen von Schließungen. – meagar

+0

Was wäre die Randverteilung der bestimmten Anzahl (n)? –

Antwort

0

Ok, gibt es drei Voraussetzungen:

  • Summe festgesetzt wird
  • Nicht wiederkehrende Zahlen
  • Zahlen in sein sollten der Bereich

Für die Anforderung # 1 ist es besser Probe aus der Verteilung, die bereits die Eigenschaft haben - Dirichlet distribution. Für den einfachsten Fall, bei dem alle Parameter gleich 1 sind, ist es auch als Simplex-Abtastung bekannt, wobei Zahlen erzeugt werden, die gleichmäßig auf N dimensional simplex verteilt sind. HEre ist Link zu C++ code.

Zum zweiten & dritten Anforderung zu erfüllen, verwenden Sie einfach die Annahme/Ablehnung

std::linear_congruential_engine<uint64_t, 2806196910506780709ULL, 1ULL, (1ULL<<63ULL)> ugen; 

float MAX = 20.0f; 
Simplex s(0.0f, 20.0f); 

std::vector<float> v(5, 0.0f); 
std::vector<int> r(5, 0); 

for(;;) { 
    s.sample(v, ugen); // sampled Dirichlet 
    for(int k = 0; k != v.size(); ++k) { 
     r[k] = 1 + int(v[k]); 
    } 
    std::sort(r.begin(), r.end()); 
    if (*r.rbegin() > 12) // array is sorted, just check last largest element 
     continue; 
    if (std::unique(r.begin(), r.end()) == r.end()) // no duplicates, good to go 
     break; 
} 

return r; 
-2

eine boolean erklären, dass bei falschen beginnt, danach eine Weile tun, die iterieren whill bis das Flag wahr ist, im Innern Während Sie iterieren werden, bis die Summe von beiden = 5 ist, werden Sie prüfen, ob die Summe = 5 mit einer If-Anweisung ist, wenn dies der Fall ist, ändern Sie den Wert der Flagge in wahr. Einfach so.

Ich empfehle Ihnen, ein wenig mehr zu studieren, da Sie wahrscheinlich neu in der Programmierung sind (zumindest das ist, was die Frage mich denken lässt, wenn du nicht da bist, dann ist etwas eindeutig falsch).

Auch gibt ya gehen: If statements
While loop

+0

Danke. Ich bin wirklich neu im Programmieren. Ich werde sofort die "if-Anweisung" lesen. – cateof

+0

Ok, dann erklärt es, lesen Sie die While-Schleife, wenn Sie nicht auch haben, und ich empfehle, dass Sie für ein C++ Buch zu lesen suchen. – MrSanchez

+0

Es wird Segmentierungsfehler genannt. Schau mal hier: https://stackoverflow.com/questions/2346806/what-is-a-segmentierung-fault – cateof

Verwandte Themen