Autor Beitrag
Delphi Noob
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

win xp
D6 Enterprise
BeitragVerfasst: Mi 31.08.05 18:56 
Folgendes Problem

Wir machen in der Schule gerade einen Vokabeltrainer.
Zuerst haben wir unsere Vokabeln in die Liste alt(array) geschrieben die Deutschen auf die ungeraden arrays(1,3 usw.) und die Englischen auf die geraden.

Jetzt sollen wir die Vokabeln in zufällig in die Liste neu schreiben.
In dem folgenden code will ich dafür Zufallszahlen zwischen 1 und 3 für die ersten 3 Paare erzeugen, also für die array 1,2,3,4,5,6

Mein Problem besteht darin das die Zufallszahlen anscheinend mehrmals verwendet werden.

P.s. habe diesen thread schon zur Hilfe genommen aber es klappt trotzdem nicht richtig
www.delphi-forum.de/...hlight=zufallszahlen


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function rand3:Byte;
begin
repeat
nr:=random(3)+1;
until (not used[nr]);
used[nr]:=true;
end;

procedure TForm1.BtnStartClick(Sender: TObject);
var i:integer;
begin
button1.enabled:=true;
inc(anzahl);
for i:=1 to 3 do
begin
rand3;
neu[i]:=alt[nr*2-1];
neu[i+1]:=alt[nr*2];
end;
DFeld.text:=neu[anzahl];

end;


Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt.
Amateur
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 777

(Win98, WinMe) WinXP Prof
D3 Prof, D6 Pers, D2k5 Pers., Turbo C++ Explorer
BeitragVerfasst: Mi 31.08.05 19:09 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function rand3:Byte;
begin
repeat
nr:=random(3)+1;
until (not used[nr]);
used[nr]:=true;
end;


also das mit dem used[nr] kann irgendwie net gehn... speicher doch in used die nummern ab also used[1]:=1 und vorher machste used alle auf 0. oder du schreibst die benutzen nummern in nen string und suchst dann in der schleife in dem string nach der zufälligen nummer einfach ne for schleife und mit if s[1]=nr then ... s is der string mit den benutzten zahlen und mit der zahl in klammern gehste die stellen des strings durch die for schleife so: for i:=1 to length(s) do..

das sollte dann jedenfalls alle zahlen speichern..

_________________
"Kein dummes Gerede. Kein Rumrätseln. Denkt an nichts anderes mehr, nur noch an das, was vor euch liegt. Das ist die wahre Herausforderung. Ihr müßt euch vor euch selbst schützen, Leute." (Rennes in "Cube")
Beiträge: >700
AG
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mi 31.08.05 19:21 
oder du schreibst reelle Zufallszahlen in ein array, merkst dir die Indizes, und ordnest dann nach der Größe; dann sollte eigentlich nichts doppelt vorkommen.
Delphi Noob Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

win xp
D6 Enterprise
BeitragVerfasst: Mi 31.08.05 21:12 
ich blick da noch nich so ganz durch kann einer von euch vll mal nen programm code schreiben? damit ich versteh wie ihr das meint

thx
LigH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: Mi 31.08.05 21:26 
Wieder einer, der sich lieber den Popo abwischen lassen will, statt sich selber mal um das Papier zu kümmern...

Was du gern haben möchtest, ist eine "zufällige Permutation". Dieses Problem ist auch bekannt als "Perfect Shuffle". Die Grundidee: Man hat am Anfang eine (z.B. sortierte) Zahlenfolge, und möchte sie un-sortieren.

So kann man die Idee eines Sortier-Algorithmus einfach umkehren: In einer der vielen Algorithmen wird die Menge rekursiv immer weiter halbiert, bis die Teilfolge nur noch aus je zwei Werten besteht. Anstatt nun Werte zu "tauschen, wenn sie die falsche Reihenfolge haben", werden sie statt dessen "immer getauscht, egal welche Reihenfolge sie haben". Und das unter Umständen mehrmals.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 31.08.05 21:29 
Weil Zufallszahlen zufällig sind, treten sie auch zufällig auf. Wenn dem nicht so wäre, könnte jeder ein Vermögen beim Roulette verdienen... (Denn dann folgte auf Rot IMMER Schwarz, oder?)

Was Du brauchst ist eine zufällig Permutation der Zahlenreihe 1....N. Eine zufällige Permutationen der Reihe 1,2,3,4,5 ist z.B. : 5,2,1,3,4. Diese Reihe gehst du sequenziell durch und hast -wupp- Deine zufällige Abfolge der Zahlen.

Wie das geht, steht hier
www.delphi-forum.de/...rder=asc&start=0
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Do 01.09.05 11:52 
Hallo!

user profile iconDelphi Noob hat folgendes geschrieben:
Zuerst haben wir unsere Vokabeln in die Liste alt(array) geschrieben die Deutschen auf die ungeraden arrays(1,3 usw.) und die Englischen auf die geraden.

Gehört zwar nicht zur eigentlichen Frage aber ich frag trotzdem. Das die deutschen Wörter auf die ungeraden Elemente des Array gelegt werden sollen und die englischen Wörter auf die geraden ist doch hoffentlich keine Vorgabe von Eurem Lehrer, oder? ;-)

Jedenfalls ist das alles anderer als sinnvoll. Mach es lieber so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  Const
    Woerter : Array [1..5of Record Deutsch, Englisch : String End = (
        (Deutsch: 'hallo';         Englisch: 'hello'),
        (Deutsch: 'programmierer'; Englisch: 'programmer'),

        { ... }

      );

Damit hast du dann eine ordenliche Struktur.

Lg Martin
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Do 01.09.05 11:56 
@ThreadStarter: Hast du randomize aufgerufen bevor du mit random arbeitest?

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Delphi Noob Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

win xp
D6 Enterprise
BeitragVerfasst: Do 01.09.05 17:32 
1. Ja genau so eine Permutation wäre genau richtig :D
2. ich hab mir den thread angeguckt und davon versteh ich fast gar nichts, sry.

3. ja es ist vorgabe von unserem info lehrer.

kann mir jemand von euch sagen wie ich so eine permutation auf meine aufgabe anwenden kann? thx im vorraus
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Do 01.09.05 17:38 
1. Erstelle eine Liste der Zahlen, die Du verwurschteln willst (For i:=1 to n do Liste[i] := i)
2. Verwurschtele sie, d.h. erzeuge eine zufällige Permutation. Der algo von Delfiphan ist der Richtige, weil einfach.
3. Nun enthält die Liste eine zufällige Abfolge der Zahlen 1..n

Und DIESEN Rest musst du selbst hinbekommen, denn sonst solltest Du
- Keyboard loslassen
- Bier wegstellen
- aufstehen
- LKW-Fahrer werden (Nichts gegen die LKW-Fahrer Zunft, da sind bestimmt auch Delphi-Geeks bei)
:wink: