Autor Beitrag
LuGo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Do 20.05.10 15:11 
Hallo Forum,

ich habe eine Frage: Gibt es eine Möglichkeit, die Einschränkungen (z.B. 1-75 und dann 100 - 150) bei random festzuhalten.

LuGo
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 20.05.10 15:27 
Hey,

da musst du dir selbst was basteln, aber so schwer is das ja nich:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function MyRandom(min, max: Integer): Integer;
begin
  result := min + random(max-min);
end;


MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Do 20.05.10 15:40 
Ich denke nicht das dies die Lösung seines Problems ist, oder?

www.delphibasics.co.uk/RTL.asp?Name=Random

Erzeuge doch einfach Zufallszahlen die zumindest im höchsten Bereich liegen und jage diese dann durch einen Filter, das nur Zufallszahlen die deinen Parametern entsprechen durchkommen.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Do 20.05.10 17:19 
das terminiert aber eventuell nicht.

Bergmanns Lösung tuts imho schon.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 20.05.10 17:57 
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Bergmanns Lösung tuts imho schon.

Behandelt aber nicht das gesuchte Problem ;)

Eventuell könnte etwas wie:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
case Random(2of
  0: Result:= RandomRange(5,10);
  1: Result:= RandomRange(20,30);
end;


funktionieren. Für die 2 übernehm ich keine Haftung, kann auch sein dass das dann random(1) wäre, müsste man mal Delphi-Hilfe lesen dazu. Steht drin.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 20.05.10 17:59 
Das ist aber auch keine so gute Lösung, weil es die Zufallsverteilung durcheinander bringt. Geht aber auch. Besser finde ich:
ausblenden Delphi-Quelltext
1:
2:
3:
Result := RandomRange(1125);
if Result > 75 then
  Inc(Result, 25);
Dann hast du einen Zahlenbereich. Wenn der Wert größer als der erste Bereich ist dann addierst du die Differenz zum zweiten dazu so dass die Zahlen in diesem Bereich liegen. Fertig. ;-)
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Do 20.05.10 18:11 
Ist ja ähnlich wie mein Vorschlag, nur das ich keine Berechnung machen wollte sondern nur gültige Zufallszahlen durchlassen wollte.
Dadurch wird ja nicht die Zufallsverteilung gestört oder?

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 20.05.10 18:45 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
Dadurch wird ja nicht die Zufallsverteilung gestört oder?
Nein, aber ich wähle meist lieber die mathematische als die Draufhau-Methode ;) .

_________________
>λ=
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Do 20.05.10 19:04 
Was ist denn daran "Haudrauf" :lol: ?

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 20.05.10 19:35 
Fällt in die gleiche Kategorie wie user profile iconNarses' Lieblingsalgorithmus "Endloses Mischen" ;) .

...und vor allem musste ich daran denken :mrgreen: .

_________________
>λ=


Zuletzt bearbeitet von Kha am Do 20.05.10 22:51, insgesamt 1-mal bearbeitet
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Do 20.05.10 19:58 
Ja und mit dem Mathematischen wird doch auch nichts anderes gemacht als der Ausgangswert ausgetauscht, ob ich ihn jetzt abändere wenn er mir nicht passt oder ich den Nächsten versuche.

Edit: Und user profile iconNarses beschäftigt sich ja in dem Beitrag eher mit dem Mischen von vorhandenen Werten, was allerdings vom Prinzip her das gleiche ist. :P
Ich erkenne deine Meinung an, finde meine Methode trotzdem nicht "so" schlecht.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Do 20.05.10 20:04 
Hi :)

Ich habe wohl leider eine veraltete Version von Entpacke-Enggepresste-Verformulierungen.dll installiert: Was will der Fragesteller? :D

lg,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)


Zuletzt bearbeitet von Hidden am Do 20.05.10 20:50, insgesamt 1-mal bearbeitet
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 20.05.10 20:15 
er will ein element "e" aus den natürlichen zahlen für das gilt: "e" element aus der menge [1 .. 75] vereinigt mit der menge [100 .. 150].

besser jetzt?

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Fr 21.05.10 01:06 
Ah, danke :D Direct-Feed in den Datenkern ohne Interpreter möglich, Großhirn übersprungen :zustimm:

user profile iconjaenickes Lösung halte ich für die Beste: Alle Intervalle zusammenschieben, und nach Rnd() wieder trennen.

ausblenden Fall für n Intervalle:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
type TRange = record
  Low, High: Integer;
end;

function RandomFromIntervals(R: Array of TRange): Integer;
{ Ranges to be passed, sorted by lower bound, in ascending order.
  Integers that are contained in several sets will still have the same probability.
  
To avoid this, and put greater probabilities on them, outcomment lines 15-18.
  Both ranges can be signed integers. }

var
  i: Integer;
  Elements: Integer;
begin
  for i := 0 to Length(R) - 2 do begin  // skips one set
    if R[i].High >= R[i+1].Low then begin   // cut away conjunctions, for exactly 1x count of each integer number that is in either set
      if R[i].High] > R[i+1].High then R[i+1].High := R[i].High;
      R[i].High := R[i+1].Low - 1;
    end;

    Inc(Elements, R[i].High - R[i].Low + 1);  // Count the number of elements in all sets
  end;
  i := Length(R) - 1;  //last set
  Inc(Elements, R[i].High - R[i].Low + 1);  // Count elements here, too(this set is not done by loop)
  Elements := RandomRange(1, Elements);  //Choose n-th element at Rnd()
  i := -1;
  while Elements > 0 do begin
    Inc(i);
    Dec(Elements, R[i].High - R[i].Low + 1);  // Count down until we find the set the n-th number is coming from
  end;  // right set
  result := R[i].High + Elements;  //High + EL = High + (el - #R[i]) = Low + el
end;


E: Ungetestet! PM @ Mistakes
E2: Fehler behoben, falls ein nachfolgendes Intervall Teilmenge des vorherigen ist.
E3: Fehler bei überschneidenden Sets behoben: Erstes gemeinsames Element wurde nicht entfernt

lg,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)


Zuletzt bearbeitet von Hidden am Sa 22.05.10 12:22, insgesamt 1-mal bearbeitet
LuGo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Sa 22.05.10 11:50 
Ich glaube ihr habt mein Problem falsch verstanden (und ich nicht gut formuliert). Ich brauche bei der Funktion random zwei verschiedene Zufallszahlenbereiche, die aber in einer Funktion drin sein sollten, die z. B. von 1 bis 75 und dann von 100 bis 150 gehen. Kann ich das mit einer solchen Funktion machen:

ausblenden Delphi-Quelltext
1:
2:
3:
procedure irgendwas
randomize;
Zahl := random (75100..150)


ich hoffe es ist jetzt verständlicher.

LuGo
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Sa 22.05.10 12:09 
Hi :)

Ich glaube, das entspricht der Definition von user profile iconelundril:
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
er will ein element "e" aus den natürlichen zahlen für das gilt: "e" element aus der menge [1 .. 75] vereinigt mit der menge [100 .. 150].


Eine Möglichkeit, Random() mit verschiedenen Intervallen aufzurufen, gibt es glaube ich nicht. Das wäre wohl auch zu speziell.
Für eine beliebige Anzahl von Intervallen kannst du meine Version benutzen, für zwei müsstest du dir etwas schreiben: Das hat user profile iconjaenicke für deine speziellen 2 Intervalle schon getan, für 2 beliebige müsstest du dir eine Funktion mit 4 Argumenten(untere Grenze 1, u2, o1, o2) wie die von user profile iconjaenicke schreiben, das hat er dir glaube ich absichtlich nicht abgenommen ;)

lg,

E:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function RandomFromTwoIntervals(u1, o1, u2, o2): Integer;
var
  Elements: Integer;
begin
  if o1 >= u2 then begin  // I2 hat Schnittmenge mit I1
    if o1 > o2 then  // I2 ist Teilmenge von I1
      o2 := o1;  // obere Grenzen tauschen
    o1 := u2 - 1;  // I1 bei u2 abschneiden; I1, I2 enthalten noch die selben Zahlen, allerdings nur einmal
  end;
  Elements := (o1 - u1 + 1) + (o2 - u2 + 1);  // Anzahl de Elemente #I1 + #I2
  Elements := Random(Elements);  // n-tes Element auswählen
  if u1 + Elements <= o1 then  // Zahl liegt im ersten Intervall
    result := u1 + Elements
  else result := u2 + (Elements - (o1 - u1 + 1));  //im 2., also
end;

//Aufruf
Notenpunkte := RandomFromTwoIntervals(031015);  // I1: Lehrer googelt. I2: Lehrer googelt nicht.


E2: Oops, Zitat berichtigt.

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)


Zuletzt bearbeitet von Hidden am Sa 22.05.10 12:32, insgesamt 4-mal bearbeitet
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Sa 22.05.10 12:22 
user profile iconLuGo hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaube ihr habt mein Problem falsch verstanden (und ich nicht gut formuliert). Ich brauche bei der Funktion random zwei verschiedene Zufallszahlenbereiche, die aber in einer Funktion drin sein sollten, die z. B. von 1 bis 75 und dann von 100 bis 150 gehen. Kann ich das mit einer solchen Funktion machen:

ausblenden Delphi-Quelltext
1:
2:
3:
procedure irgendwas
randomize;
Zahl := random (75100..150)


ich hoffe es ist jetzt verständlicher.

LuGo


Hat user profile iconjaenicke doch schon oben getan, dass in eine Funktion zu packen dürfte ja wohl kein Problem sein.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.