Erzeuge drei zufällige Zeichen in Delphi

8

Hi Ich versuche, drei zufällige Zeichen mit einer Funktion in Delphi zu generieren, der Code ist dies:

%Vor%

Das Problem ist, dass mich Dinge wie 20142 zurückhaben, wenn ich tatsächlich 3 Zeichen konstante Zufallsvariablen abwartet.

    
Jose Martinez 09.11.2013, 22:25
quelle

7 Antworten

14
___ qstntxt ___

Hi Ich versuche, drei zufällige Zeichen mit einer Funktion in Delphi zu generieren, der Code ist dies:

%Vor%

Das Problem ist, dass mich Dinge wie 20142 zurückhaben, wenn ich tatsächlich 3 Zeichen konstante Zufallsvariablen abwartet.

    
___ answer19883889 ___

Sie fügen das Ergebnis von %code% zu Ihrem %code% hinzu, nicht den zufälligen Buchstaben aus den Konstanten.

Versuchen Sie stattdessen etwas ähnliches - es verwendet die Rückgabe von %code% als Index in die Zeichenfolgenkonstanten:

%Vor%     
___ answer19883912 ___

Sehen wir uns an, was Ihr Code macht, wie ein Compiler es sieht:

%Vor%

IntToStr nimmt eine Zahl (z. B. %code% ) und wandelt sie in eine Zeichenfolge um (z. B. %code% ). Was Sie tun möchten, ist die Verwendung des Zufallswerts, um in Ihr Array zu indizieren, so:

%Vor%     
___ answer45236084 ___
%Vor%     
___ answer19900560 ___

Schneller wäre es, die erneute Zuweisung von Speicher immer wieder zu vermeiden.

%Vor%

Und manchmal sogar etwas schneller wäre die Verwendung der lokalen Variablen, um einige zusätzliche %code% Aufrufe für den var-Parameter %code% zu vermeiden.

Allerdings sollten Timings oder Code-Prüfungen auf CPU-Ebene für die jeweilige Compiler-Version und Optionen vorgenommen werden, um zu sehen, welchen Unterschied dies tatsächlich macht, falls vorhanden.

%Vor%

PS. Ord-basierte Ansatz ist auch hier besser als ein Char von Array / String, aber das ist ein unabhängiges Problem. Ich würde auch vorsichtig sein, %code% -Funktion mit Delphi 2009 oder neuer zu verwenden, es würde nur einheitlich auf # 0 .. # 127 Werte arbeiten. Explizit deklarierte Typumwandlungen wie %code% und %code% könnten stabiler Ersatz sein, da Sie eines Tages Buchstaben außerhalb des 7-Bit-Teilbereichs benötigen, wie zB eña und andere europäische spezifische.

    
___ answer35955153 ___

Dies erzeugt zufällige Zeichenfolgen, die wie Wörter aussehen.

%Vor%

Also, benutze es so: GenerateRandomWord (3);

    
___ tag123delphi ___ Delphi ist eine Sprache für die schnelle Entwicklung von nativen Windows-, macOS-, Linux-, iOS- und Android-Anwendungen mithilfe von Object Pascal. Der Name bezieht sich sowohl auf die Delphi-Sprache als auch auf deren Bibliotheken, Compiler und IDE, mit denen Delphi-Projekte bearbeitet und debuggt werden können. ___ answer39603213 ___
%Vor%     
___ antwort19884053 ___

Ihr Code konvertiert ganzzahlige Indexwerte in Zeichenfolgen. Beachten Sie, dass Ihre einzige Referenz auf Ihre Konstanten ihre Länge ist. Sie geben Indizes statt Zeichen zurück.

Sie könnten Ihren Code reparieren, indem Sie die von Ihnen generierten Ganzzahl-Indizes verwenden, um Elemente innerhalb Ihrer String-Konstanten zu referenzieren. Mason und Ken haben gezeigt, wie man das macht.

Persönlich würde ich die Konstanten weglassen und

schreiben %Vor%

und

%Vor%

und

%Vor%

Die ordinalen Werte dieser Zeichen wurden weit zurückentwickelt, um solchen Code zu erlauben.

    
___ qstnhdr ___ Erzeuge drei zufällige Zeichen in Delphi ___
David Heffernan 09.11.2013, 22:45
quelle
9

Sehen wir uns an, was Ihr Code macht, wie ein Compiler es sieht:

%Vor%

IntToStr nimmt eine Zahl (z. B. 5 ) und wandelt sie in eine Zeichenfolge um (z. B. '5' ). Was Sie tun möchten, ist die Verwendung des Zufallswerts, um in Ihr Array zu indizieren, so:

%Vor%     
Mason Wheeler 09.11.2013 22:31
quelle
8

Sie fügen das Ergebnis von Random zu Ihrem finalr hinzu, nicht den zufälligen Buchstaben aus den Konstanten.

Versuchen Sie stattdessen etwas ähnliches - es verwendet die Rückgabe von Random als Index in die Zeichenfolgenkonstanten:

%Vor%     
Ken White 09.11.2013 22:29
quelle
0

Schneller wäre es, die erneute Zuweisung von Speicher immer wieder zu vermeiden.

%Vor%

Und manchmal sogar etwas schneller wäre die Verwendung der lokalen Variablen, um einige zusätzliche UniqueString Aufrufe für den var-Parameter Result zu vermeiden.

Allerdings sollten Timings oder Code-Prüfungen auf CPU-Ebene für die jeweilige Compiler-Version und Optionen vorgenommen werden, um zu sehen, welchen Unterschied dies tatsächlich macht, falls vorhanden.

%Vor%

PS. Ord-basierte Ansatz ist auch hier besser als ein Char von Array / String, aber das ist ein unabhängiges Problem. Ich würde auch vorsichtig sein, Chr -Funktion mit Delphi 2009 oder neuer zu verwenden, es würde nur einheitlich auf # 0 .. # 127 Werte arbeiten. Explizit deklarierte Typumwandlungen wie AnsiChar(i) und WideChar(i) könnten stabiler Ersatz sein, da Sie eines Tages Buchstaben außerhalb des 7-Bit-Teilbereichs benötigen, wie zB eña und andere europäische spezifische.

    
Arioch 'The 11.11.2013 06:58
quelle
0

Dies erzeugt zufällige Zeichenfolgen, die wie Wörter aussehen.

%Vor%

Also, benutze es so: GenerateRandomWord (3);

    
Sahara 12.03.2016 07:51
quelle
0
%Vor%     
Vladimir 21.07.2017 11:05
quelle
-1
%Vor%     
Heinrich 20.09.2016 20:30
quelle

Tags und Links