Was ist der Unterschied zwischen rand() und random () - Funktionen?
Einmal, mein Lehrer hat mich gelehrt, zu verwenden randomize()
und random()
Funktion zur Erzeugung von Pseudo-zufälligen zahlen in C++ Builder. Nun, ich arbeite lieber im VS 2012, aber als ich versuchte, diese Funktionen zu nutzen gibt es sagt, dass "Bezeichner nicht gefunden", auch wenn ich Hinzugefügt #include <stdlib.h>
. Nach einiger Zeit Googeln fand ich, dass es auch rand()
und srand()
Funktionen. Was ist der Unterschied zwischen Ihnen und denen ist es besser, zu verwenden?
sollten Sie die random header zumal mit rand() ist schädlich
"schädlich" ist eine subjektive Maßnahme. Es hängt davon ab, was Sie tun. Es ist einfach nur en pseudo-random generator, nachdem alle.
Es ist eine sehr beschissen, und es ist nicht möglich zu beweisen, alle Eigenschaften über die Verteilung (das ist wahrscheinlich wichtig, wenn Sie mit dem erzeugen von Zufallszahlen in den ersten Platz.)
"schädlich" ist eine subjektive Maßnahme. Es hängt davon ab, was Sie tun. Es ist einfach nur en pseudo-random generator, nachdem alle.
Es ist eine sehr beschissen, und es ist nicht möglich zu beweisen, alle Eigenschaften über die Verteilung (das ist wahrscheinlich wichtig, wenn Sie mit dem erzeugen von Zufallszahlen in den ersten Platz.)
InformationsquelleAutor Sunrise | 2013-09-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
randomize()
undrandom()
sind nicht Teil der standard-Bibliothek. Vielleicht ist Ihr Lehrer schrieb-Funktionen mit diesen Namen für die Verwendung in der eigenen Klasse, oder vielleicht haben Sie wirklich bedeutenrandom()
undsrandom()
Teil von POSIX und nicht auf Windows.rand()
undsrand()
sind Teil der standard-Bibliothek und wird von jedem standard-konforme Implementierung von C++.Sollten Sie vermeiden
rand()
undsrand()
und Nutzung der neuen C++11<random>
Bibliothek.<random>
wurde Hinzugefügt als Teil der standard C++11 (und VS2012 nicht liefern).Video zu erklären, warum:
rand()
Als Schädlichrand()
ist in der Regel eine niedrige Qualität pRNG und nicht geeignet für Anwendungen, die einen angemessenen Grad an Unberechenbarkeit.<random>
bietet eine Vielzahl von Motoren mit unterschiedlichen Eigenschaften geeignet für viele unterschiedliche Anwendungsfälle.Umwandlung der Ergebnisse von
rand()
in einer Nummer, die Sie direkt verwenden können, in der Regel stützt sich auf code, der schwierig ist zu Lesen und einfach falsch, in der Erwägung, dass mit<random>
Distributionen ist einfach und erzeugt lesbaren code.Den gängigen Methoden der Generierung von Werten in einer gegebenen Verteilung mit
rand()
weiteren Rückgang der Qualität der generierten Daten.%
im Allgemeinen Verzerrungen der Daten und Gleitkomma-division, die noch produziert ungleichmäßige Verteilungen.<random>
Distributionen sind höhere Qualität sowie mehr lesbar.rand()
setzt auf eine versteckte Globale Ressource. Unter anderem diese Ursachenrand()
nicht thread-sicher. Einige Implementierungen machen, thread-Sicherheit garantiert, aber dies ist nicht erforderlich, standard. Motoren vorgesehen, die durch<random>
Kapseln pRNG Staat als Objekte mit Wert-Semantik, die eine flexible Kontrolle über den Staat.srand()
erlaubt nur eine begrenzte Auswahl an Samen. Motoren in<random>
werden kann, initialisiert mit seed-Sequenzen, die es erlauben, die maximal mögliche seed-Daten.seed_seq
implementiert auch eine gemeinsame pRNG warm-up.Beispiel für die Verwendung
<random>
:rand()
kann weitgehend ausreichend. (Auch, warum alle diese Präsentationen als videos? C++ ist hauptsächlich Professionell genutzt, was bedeutet, dass wir nicht aktivieren, ist der sound auf unseren Maschinen und können nicht sehen Sie ein video.)Kopfhörer sind praktisch in einem Büro. Es gibt wohl auch anständige text-Ressourcen, aber ich kenne keine aus der hand. Auch wenn Qualität und nicht-Homogenität ist kein Problem, sollte man trotzdem lieber
<random>
einfach für die Lesbarkeit.Es gibt keine Umstände, in denen
<random>
verfügbar ist, aberrand()
sollte bevorzugt werden. Und Sie sind falsch, niemand hält sichrand()
schädlich.rand()
ist einfach zu förderlich für die falsche Nutzung (nicht nur in Bezug auf Qualität, aber auch die Erstellung von Daten-Rennen) und bietet keine Vorteile gegenüber den alternativen.war nichts drin, ich war nicht schon gründlich bewusst", Und es war nichts in ihm, ich war nicht bewusst zu sein. Ich denke, sobald eine person etwas weiß, sollten wir brennen alle Kopien dieser Informationen und Sie nie erwähnen Sie es? "die meisten Menschen können nicht mit C++11 noch" Es könnte der Fall sein, dass die meisten Menschen nicht in C++11, aber oft ist das nicht, da C++11 ist nicht verfügbar für Ihre Plattform. Programmierer, Manager, usw. sollten ermutigt werden, sich zu bewegen, zu C++11. Teil, der zeigt, wie es besser geht.
nicht in Produktion code, außer in Ausnahmefällen" Wie ich schon sagte, es gibt keine Umstände, in denen
<random>
verfügbar ist, aberrand()
sollte bevorzugt werden. Ich denke auch, dass 'außergewöhnliche' ist ein unterschätzen von seiner Verfügbarkeit. "aber es ist die einfachste Lösung", Wenn von 'einfacher' meinst du, die gleiche Art von Sache, wie die Leute, die sagen, dass C sollte bevorzugt auf C++, weil es 'einfacher'. In Bezug auf die meisten direkt mit dem Ausdruck die Bedeutung eines Programms finde ich<random>
einfacher. Immer die gleiche Abstraktionsebene ausrand()
bedeutet der Umsetzung selbst.InformationsquelleAutor bames53
Obwohl es (offensichtlich) Leute, die behaupten, mit religiöser Inbrunst, dass rand() ist schlecht und random() ist nicht, es stellt sich heraus, dass Ihre Laufleistung variieren. Hier ist das gcc Antwort auf die Frage "Was ist der Unterschied...", wie es geliefert wird, durch die gcc-version der stdlib.h (Hervorhebung Hinzugefügt):
/* Dies sind die Funktionen, die tatsächlich Dinge tun. Die
random',
srandom',initstate' and
setstate' - Funktionen sind diejenigen, die aus BSD-UNIX-Derivate.Die
rand' and
srand' Funktionen erforderlich sind, ist durch den ANSI-standard.Wir bieten beide Schnittstellen auf den gleichen Zufallszahlen-generator. /
/ Gibt einen zufälligen long integer zwischen 0 und RAND_MAX inclusive. */
InformationsquelleAutor Atlant
Es sieht aus wie Sie wurden mit Hilfe von C-Funktionen, obwohl Ihre Frage mit der Bezeichnung C++. Auch
stdlib.h
ist eine header-Datei von C-standard-Bibliothek. Es gibt keine solche Funktionen sindrandom()
undrandomize()
in C standard-Bibliothek. Der C-standard-Bibliothek hatrand()
undsrand()
.Wenn Sie wurden mit
random()
oder so etwas wie, dass durchstdlib.h
, es müssen schon einige nicht-standard-library-Erweiterung in Borland-compiler-Paket.So, wenn Sie halten wollen, C-Format standard-Funktionen, das wäre wieder
rand()
undsrand()
. Aber wenn Sie schreiben in C++, haben Sie vielleicht bessere (und besser geeignete) Optionen im C++ - standard-Bibliothek.Das ist das, was nicht-standard-bedeutet, ja.
InformationsquelleAutor AnT
srand()
ist die C Standard library Implementierung für das seeding der (pseudo) random number generator.rand()
ist die (pseudo) random number generator in C-Standard-Bibliothek.C++ implementiert hat, einen neuen (pseudo) random number generator in der
<random>
header-Datei, die eine Vielzahl von verschiedenen Motoren zu verwenden: http://en.cppreference.com/w/cpp/numeric/randomInformationsquelleAutor Zac Howland
Funktionen
rand()
undrandom()
sind entweder POSIX definiert, die seit mindestens POSIX.1-2001 (undrandomize()
ist nicht genormt).Auf ältere
rand()
- Implementierungen auf aktuellen Implementierungen auf verschiedenen Systemen, die unteren bits sind viel weniger zufällig als die höherwertigen bits.Wenn verfügbar,
random()
nicht leiden von diesem Problem.Hinzufügen, moderne version von
rand()
Verwendung der gleichen Zufallszahlen-generator wierandom()
. Sorand()
mag korrekt sein, aber es ist nicht garantiert.So, immer
random()
stattrand()
. Wennrandom()
ist nicht verfügbar auf Ihrem Betriebssystem, Fragen zu Betriebssystem-Entwickler, um neue standards API-Implementierung (2001 standard ist jetzt alt genug, um zu erwarten, dass jedes system zu geben).InformationsquelleAutor Jezz
Ich bin nicht vertraut mit
randomize()
undrandom()
aber Sie sind nicht Teil der standard-Bibliothek. Sie sollten vermeiden Sie die Verwendungrand()
dieses video erklärt, warum mithilfe von rand() ist schädlich.Sollten Sie mit Hilfe der random header eingeführt C++11, hier ist ein Beispiel mit beiden std::uniform_real_distribution und std::uniform_int_distribution:
InformationsquelleAutor Shafik Yaghmour
Dies ist ein work-around mit Zufallszahlen form, außerhalb von c++.
Dies ist das ursprüngliche Programm in C, kopiert von "http://www.programmingsimplified.com/"
Dieses Programm kann nicht ausgeführt werden, weil die " temp1 = 1 + random ( 588 );"
"temp2 = 1 + random ( 380 );"
Erklärungen funktionieren nicht. 'random' ist nicht eine Funktion der Grafik.h, conio.h oder stdlib.h
Noch funktioniert es, wenn Sie auch zufällige.h.
Unter dieser Auflistung ist ein work-around für die random-Funktion.
Die Zufallszahlen werden generiert, mit einer einfachen MS Excel-makro, hier aufgelistet:
Dieser generiert 2 Spalten von Zufallszahlen. Jede Spalte wird kopiert und eingefügt
seine eigenen *.txt-Datei , d.h. rnd1.txt und rnd2.txt und in einem Verzeichnis abgelegt, wo Sie sein können
der Zugriff auf c++ - Programms, die folgt.
Ersetzen Sie die "c:\PATH\rnd1.txt" und "C:\PATH\rnd2.txt" mit dem richtigen Pfad.
Dieses Programm wird für etwa 40 Sekunden und dann beendet.
Grafik.h, conio.h und... EXEL? Ernsthaft?
InformationsquelleAutor LJTurk