<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Zufallsliste erstellen OHNE Doppelten]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte aus einem (großen Ordner) 500 zufällige Dateien auswählen. Keine Datei darf doppelt ausgewählt werden.</p>
<p>Das drumehrum mache ich mit QT, das funktioniert auch soweit alles wunderbar, aber ich muss in der Liste logischerweise verhinern, dass doppelte Einträge vorhanden sind. Kommen wir nun aber zu meinem bisherigen Quellcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;
#include &lt;vector&gt;

int main(int argc, char *argv[])
{
	  srand(time(NULL));
	  int length = 15000; //flist.length();

	  std::vector&lt;int&gt; Number(500);

	  for (int i=0;i&lt;500;i++)
		  Number[i] = rand() % length;
}
</code></pre>
<p>Soweit so gut, nur hier können ja doppelte Einträge wohl kommen, also z.b. dass der Eintrag 1000 zweimal vorhanden ist.</p>
<p>Wie vermeide ich das?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/281723/zufallsliste-erstellen-ohne-doppelten</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 16:38:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/281723.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 Feb 2011 19:52:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Sun, 06 Feb 2011 19:52:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte aus einem (großen Ordner) 500 zufällige Dateien auswählen. Keine Datei darf doppelt ausgewählt werden.</p>
<p>Das drumehrum mache ich mit QT, das funktioniert auch soweit alles wunderbar, aber ich muss in der Liste logischerweise verhinern, dass doppelte Einträge vorhanden sind. Kommen wir nun aber zu meinem bisherigen Quellcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;
#include &lt;vector&gt;

int main(int argc, char *argv[])
{
	  srand(time(NULL));
	  int length = 15000; //flist.length();

	  std::vector&lt;int&gt; Number(500);

	  for (int i=0;i&lt;500;i++)
		  Number[i] = rand() % length;
}
</code></pre>
<p>Soweit so gut, nur hier können ja doppelte Einträge wohl kommen, also z.b. dass der Eintrag 1000 zweimal vorhanden ist.</p>
<p>Wie vermeide ich das?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017491</guid><dc:creator><![CDATA[CaribicSurfer]]></dc:creator><pubDate>Sun, 06 Feb 2011 19:52:32 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Sun, 06 Feb 2011 19:56:14 GMT]]></title><description><![CDATA[<p>1. Container mit Zahlen von 1 bis zur Anzahl Dateien im Ordner füllen<br />
2. <code>std::random_shuffle()</code><br />
3. Erste 500 Elemente anschauen</p>
<p>Ist O(n), im Gegensatz zum Herausfinden, ob die Zahl schon einmal genommen wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017494</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 06 Feb 2011 19:56:14 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Sun, 06 Feb 2011 19:56:27 GMT]]></title><description><![CDATA[<p>Zuvor gewählte Nummern speichern und bei neuer Zufallszahl prüfen ob sie in der Liste enthalten; und somit schon einmal ausgewählt worden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017495</guid><dc:creator><![CDATA[il]]></dc:creator><pubDate>Sun, 06 Feb 2011 19:56:27 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Sun, 06 Feb 2011 20:04:19 GMT]]></title><description><![CDATA[<p>N: Anzahl der zu ziehenden Zahlen<br />
I: Anzahl der möglichen Zahlen</p>
<p>a) Container mit den ziehbaren Zahlen füllen.<br />
b) Zahl I ziehen, nenne diese R<br />
c) Zahl an Containerposition R nehmen. Zahl an Stelle R mit letzter Zahl aus Container ersetzen<br />
d) I um eins erniedrigen<br />
e) Weiter bei b, bis N Zahlen gezogen.</p>
<p>Dies ist im Gegensatz zu Nexus Vorschlag O(N), Nexus ist (bei meiner Notation) O(I), und es ist immer N&lt;I.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017501</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 06 Feb 2011 20:04:19 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Sun, 06 Feb 2011 20:09:36 GMT]]></title><description><![CDATA[<p>Danke an alle</p>
<p>Habs nun erstmal mit Nexus Ansatz eine Lösung:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; Number(length);
for (int i=0;i&lt;length;i++)
Number[i] = i;

std::random_shuffle(Number.begin(),Number.end());
</code></pre>
<p>Werde mir später den Ansatz von SeppJ anschauen, den habe ich nicht auf Anhieb verstanden.</p>
<p>Danke und Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017507</guid><dc:creator><![CDATA[CaribicSurfer]]></dc:creator><pubDate>Sun, 06 Feb 2011 20:09:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Sun, 06 Feb 2011 20:15:48 GMT]]></title><description><![CDATA[<p>CaribicSurfer schrieb:</p>
<blockquote>
<p>Werde mir später den Ansatz von SeppJ anschauen, den habe ich nicht auf Anhieb verstanden.</p>
</blockquote>
<p>Ich glaube ich habe mich nur kompliziert ausgedrückt. Das ist ganz einfach: Du hast eine Liste mit allen möglichen Zahlen, wenn du eine ziehst, dann entfernst du die Zahl aus der Liste. Fertig.</p>
<p>Das mit dem Einfügen der letzten Zahl und so sind bloß Details, weil dies die effizienteste Möglichkeit ist, ein Element aus einem vector zu entfernen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017515</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 06 Feb 2011 20:15:48 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Sun, 06 Feb 2011 20:27:04 GMT]]></title><description><![CDATA[<p>@ SeppJ: Du hast mehrere Möglichkeiten, eine Zahl aus der Liste zu ziehen. Vom anfänglichen Füllen, das ohnehin O(I) benötigt, sehen wir nun einmal ab. Wenn man STL-Container verwendet, ergeben sich meiner Ansicht nach folgende Fälle:</p>
<p>1. Liste mischen -&gt; benötigt O(I)</p>
<p>2. Liste aufsteigend sortiert lassen, Index als Zufallszahl in [1,I[ erzeugen, Element an der Stelle löschen.</p>
<p>2a. <code>std::vector</code> , <code>std::deque</code> : Löschen benötigt O(I)<br />
2b. <code>std::list</code> : Kein Random Access, Zugriff braucht O(I)</p>
<p>Hab ich was übersehen?</p>
<p><em>Edit: Ah, alles klar. Löschen aus Random-Access-Containern geht ja mit dem Swap-Trick in O(1). Die Technik empfehle ich sogar selbst regelmässig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017522</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 06 Feb 2011 20:27:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Sun, 06 Feb 2011 20:35:52 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p><em>Edit: Ah, alles klar. Löschen aus Random-Access-Containern geht ja mit dem Swap-Trick in O(1). Die Technik empfehle ich sogar selbst regelmässig <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></em></p>
</blockquote>
<p>Könntest du das bitte genauer erklären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017530</guid><dc:creator><![CDATA[Zwischenfrager]]></dc:creator><pubDate>Sun, 06 Feb 2011 20:35:52 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Sun, 06 Feb 2011 20:40:46 GMT]]></title><description><![CDATA[<p>Aber sicher doch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<pre><code class="language-cpp">// 1. Benötigt O(n), wobei n = #Elemente
// (alle nachfolgenden Elemente werden nach vorne verschoben)
myVector.erase(myIterator);

// 2. Benötigt O(1)
// (nur letztes Element wird gelöscht, dafür wird die
// Reihenfolge verändert, was aber oft egal ist)
swap(*myIterator, myVector.back());
myVector.pop_back();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2017532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017532</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 06 Feb 2011 20:40:46 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Sun, 06 Feb 2011 20:58:07 GMT]]></title><description><![CDATA[<p>Danke für die Erklärung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017540</guid><dc:creator><![CDATA[Zwischenantworter]]></dc:creator><pubDate>Sun, 06 Feb 2011 20:58:07 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Mon, 07 Feb 2011 07:56:50 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>N: Anzahl der zu ziehenden Zahlen<br />
I: Anzahl der möglichen Zahlen</p>
<p>a) Container mit den ziehbaren Zahlen füllen.<br />
b) Zahl I ziehen, nenne diese R<br />
c) Zahl an Containerposition R nehmen. Zahl an Stelle R mit letzter Zahl aus Container ersetzen<br />
d) I um eins erniedrigen<br />
e) Weiter bei b, bis N Zahlen gezogen.</p>
<p>Dies ist im Gegensatz zu Nexus Vorschlag O(N), Nexus ist (bei meiner Notation) O(I), und es ist immer N&lt;I.</p>
</blockquote>
<p>exakt genauso mach ich das auch. Man hat keine Vergleiche, und keinen Ballast, außer dass man ein zusätzliches Array erzeugen muss und danach wieder zerstören muss. Schnell gehts wohl kaum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017657</guid><dc:creator><![CDATA[it0101_loggedoff]]></dc:creator><pubDate>Mon, 07 Feb 2011 07:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to Zufallsliste erstellen OHNE Doppelten on Mon, 07 Feb 2011 11:35:49 GMT]]></title><description><![CDATA[<p>Es geht auch ohne &lt;int&gt; Array - Performance müsste man testen.</p>
<p>Ich gehe davon aus das du mit den Dateien auch irgendwas machen willst?<br />
Hol dir ein <code>QDir meinDir(derPfadZuDenDateien);</code> Nutze dessen <code>entryList()</code> um alle Datein zu bekommen. Stopf die resultierende QStringList mit ihren Iteratoren in <code>std::rnd_shuffle(stringlist.begin(),stringlist.end())</code> . Mach dann ein <code>stringlist.erase(stringlist.begin()+500);</code> darauf - dann kannst du direkt damit weiterarbeiten...</p>
<p>Unter Umständen ist das schneller als jedesmal den n-ten Filenamen wieder zu holen - insgesamt musst du das aber testen da es stark davon abhängt wie Qt die Interna der Listen handelt und wie da wo optimiert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017748</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Mon, 07 Feb 2011 11:35:49 GMT</pubDate></item></channel></rss>