Avatar billede daniel_d Nybegynder
28. januar 2003 - 12:39 Der er 62 kommentarer og
2 løsninger

Tilfældig udvælgelse af tal ud fra et andet tal

Hvordan kan man teoretisk lave en procedure der udvælger et tilfældigt tal mellem f.eks. 100.000 og 150.000 baseret på et tal mellem 1 og 99

Jeg havde tænkt på noget i stil med:
Men kan ikke finde ud af beregningsdelen.
OBS: jeg er bare intereseret i teorien om hvordan man matematisk udregner et sådant tal. Pseudokode er fint nok, da sproget ikke er udvalgt endnu.

Inputs:
Antallet af lodsedler = (et tal større end 100.000)
Bestemt_af_vinder = (et tal mellem 1 og 99)

Startværdi:    = 100.000
Slutværdi:    = Antallet af lodsedler
Nøgletal:    = Bestemt_af_vinder

Beregning      = Beregning her
Beregning    = et heltal (ikke kommatal)

Output:
Output_tal:    = Beregning

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 12:40 #1
Ups:

Men kan ikke finde ud af beregningsdelen.
OBS: jeg er bare intereseret i teorien om hvordan man matematisk udregner et sådant tal. Pseudokode er fint nok, da sproget ikke er udvalgt endnu.

Skulle stå til sidst

/mvh
Avatar billede arnvig Nybegynder
28. januar 2003 - 12:42 #2
Tal = Nøgletal(1-99) * 500 + 99500
Avatar billede arnvig Nybegynder
28. januar 2003 - 12:46 #3
Nmax = 99
Nmin = 1
Start = 100.000
Slut = 150.000

Tal= Nøgletal * ((slut-start)/(nmax-nmin)) + (start - (slut-start)/(nmax-nmin))
Avatar billede daniel_d Nybegynder
28. januar 2003 - 12:58 #4
kigger lige på det

/mvh
Avatar billede mfalck Praktikant
28. januar 2003 - 13:01 #5
Avatar billede daniel_d Nybegynder
28. januar 2003 - 13:02 #6
Hvis jeg bruger nøgletal = 99
før jeg et tal der hedder 60.000
Tallet skulle være over 100.000
eller mellem start og slut
Avatar billede arne_v Ekspert
28. januar 2003 - 13:08 #7
Kunne du forklare mere præcist hvad du skal bruge det til ?

Jeg har bl.a. ikke helt forstået, hvor det tilfælde kommer ind henne.
Avatar billede daniel_d Nybegynder
28. januar 2003 - 13:16 #8
Arne> Jeg skal bruge en funktion der ud fra et user-input(1-99) tilfældigt kan generere et heltal mellem f.eks. 100.000 og 150.000
Men det er måske svært idet tallet 1-99 så skal ku dække over 50.000 tal. Bedre er det måske hvis det blot skal være et tilfældigt tal mellem 100.000 og f.eks. 150.000

/mvh
Avatar billede arne_v Ekspert
28. januar 2003 - 13:18 #9
Noget Java kode:

import java.util.Random;

public class SpecialRandom {
    private static Random rng;
    public static void main(String[] args) {
        rng = new Random();
        for(int i = 0; i < 10; i++) {
            System.out.println(aRandom());
        }
    }
    private static int aRandom() {
        int n_1_99 = rng.nextInt(98) + 1;
        int n_100000_150000 = 100000 + (n_1_99 - 1) * (50000 / 98);
        return n_100000_150000;
    }
}
Avatar billede arne_v Ekspert
28. januar 2003 - 13:21 #10
Aha.

Så er vi ovre i noget i retning af:

import java.util.Random;

public class SpecialRandom {
    private static Random rng;
    public static void main(String[] args) {
        rng = new Random(Integer.parseInt(args[0]));
        for(int i = 0; i < 10; i++) {
            System.out.println(aRandom());
        }
    }
    private static int aRandom() {
        return 100000 + rng.nextInt(50001);
    }
}
Avatar billede arnvig Nybegynder
28. januar 2003 - 13:22 #11
Daniel_D> min pseudo kode er korrekt.
du har måske bare tastet forkert på lommeregneren.
Avatar billede arne_v Ekspert
28. januar 2003 - 13:22 #12
Du bruger et tal (1-99) somm seed til random generatoren (her sendt
som første argument til programmet).

Og så genererer du 1 eller flere (her 10) tilfældige tale 100000-150000
udfra det.
Avatar billede arne_v Ekspert
28. januar 2003 - 13:24 #13
Hvis du vil kunne genskabe tallene så kan du bruge:
  rng = new Random(Integer.parseInt(args[0]));
som jeg skrev. Hvis du vil have dem mere ægte randomiseret, så kan
du vælge:
  rng = new Random(System.currentTimeMillis() + Integer.parseInt(args[0]));
Avatar billede arne_v Ekspert
28. januar 2003 - 13:25 #14
Og vær meget opmærksom på grænse-værdierne.

Jeg har forudsat at du virkeligt mente 1..99 (99 tal) og
100000..150000 (50001 tal).
Avatar billede arnvig Nybegynder
28. januar 2003 - 13:26 #15
Tal = Heltal(random(nøgletal) * 50000) + 100000
Avatar billede arne_v Ekspert
28. januar 2003 - 13:26 #16
Og for dem der ikke kender Java så godt:
  nextInt(N) returnerer en tilfældigt int 0..N-1
Avatar billede daniel_d Nybegynder
28. januar 2003 - 13:32 #17
Arne> Jeg mener præcis et tal mellem 1...99 som seed
Startværdien vil altid være 100.000
Slutværdien kan variere og er altså en variabel som skal ændres fra gang til gang. Nu har jeg ikke selv meget forstand på Java, men hvis den eks. skulle generere 50 tilfældige tal, så kan man vel godt få dem udskrevet på skærmen ik?

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 13:33 #18
Hvad sker der hvis seed er 2 og startværdi er 100.000 og slutværdi er 150.000
Vil den så altid generere samme talværdier ?
Avatar billede arnvig Nybegynder
28. januar 2003 - 13:35 #19
Daniel_d: Måske vil det være bedre, hvis du forklarer lidt nærmere hvad du skal bruge det til ?
Avatar billede arnvig Nybegynder
28. januar 2003 - 13:36 #20
Hvis du bruger samme seed, vil du få samme rækkefølge af tilfældige tal.
Avatar billede daniel_d Nybegynder
28. januar 2003 - 13:41 #21
Arnvig:
Nmax = 99
Nmin = 1
Start = 100.000
Slut = 150.000

Tal= Nøgletal * ((slut-start)/(nmax-nmin)) + (start - (slut-start)/(nmax-nmin))
Tal= 50*((150.000-100.000)/(99-1))+(100.000 - (150.000-100.000)/(99-1))
tal= 125000

Du har ret, dog er kan man diskutere hvorvidt tallet så er tilfældigt

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 13:49 #22
Hvis jeg skal forklare det lidt nærmere...ok

Man forestiller sig at en masse personer har købt nogle lodsedler. f.eks. 50.000 lodsedler. Af de lodsedler skal der udtrækkes en vindergruppe på f.eks. 50 personer. Udtrækningen skal så foregå ved at en person indtaster sit lykkenr.(mellem 1 og 99) og på baggrund af dette og antallet af lodsedler mellem udvælges tilfældigt en talrække på 50 forskellige numre

Tror ikke jeg kan forklare det nærmere

/mvh
Avatar billede arne_v Ekspert
28. januar 2003 - 13:49 #23
import java.util.Random;

public class SpecialRandom {
    private final static int D = 50000;
    private static Random rng;
    public static void main(String[] args) {
        int seed = Integer.parseInt(args[0]);
        if ((seed >= 1) && (seed <= 99)) {
            rng = new Random(seed);
            for (int i = 0; i < 50; i++) {
                System.out.println(aRandom());
            }
        } else {
            System.out.println("Error in seed");
        }
    }
    private static int aRandom() {
        return 100000 + rng.nextInt(D + 1);
    }
}

vil verifcere at seed er 1..99 og generere 50 tilfældige tal
100000..100000+D !
Avatar billede daniel_d Nybegynder
28. januar 2003 - 13:50 #24
arnvig>Hvis du bruger samme seed, vil du få samme rækkefølge af tilfældige tal
Dvs samme tal man ender ud med ?

/mvh
Avatar billede arne_v Ekspert
28. januar 2003 - 13:51 #25
samme seed => samme "tilfældige" tal´

Derimod vil:

import java.util.Random;

public class SpecialRandom {
    private final static int D = 50000;
    private static Random rng;
    public static void main(String[] args) {
        int seed = Integer.parseInt(args[0]);
        if ((seed >= 1) && (seed <= 99)) {
            rng = new Random(System.currentTimeMillis() + seed);
            for (int i = 0; i < 50; i++) {
                System.out.println(aRandom());
            }
        } else {
            System.out.println("Error in seed");
        }
    }
    private static int aRandom() {
        return 100000 + rng.nextInt(D + 1);
    }
}

generere forskellige tal udfra samme seed, da tiden også indgår
i seed.
Avatar billede arne_v Ekspert
28. januar 2003 - 13:52 #26
Om du skal foretrække reproducerbarhed eller tilfældighed vil nok
afhænge lidt af hvad du dkal bruge det til.
Avatar billede arne_v Ekspert
28. januar 2003 - 13:54 #27
Læste lige din sidste beskrivelse af hvad du vil.

Jeg ville nok prioritere tilfældighed i den kontekst.

Og det er indlysende at løsningerne med et tilfældigt tal 1..99
der transformeres til 100000..150000 er helt utilstrækkelige
i denne sammenhæng.
Avatar billede daniel_d Nybegynder
28. januar 2003 - 13:54 #28
arne_v> Hvordan kan jeg teste din javakode
kan man lave det som en javaapplet el. lign ??

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 13:57 #29
arne v>
>Og det er indlysende at løsningerne med et tilfældigt tal 1..99
>der transformeres til 100000..150000 er helt utilstrækkelige
>i denne sammenhæng.

Skal det forstås som at du ikke mener tallet vil blive tilfældigt nok eller at din eller arnvigs løsning ikke er anvendelig i denne situation ?

/mvh
Avatar billede arne_v Ekspert
28. januar 2003 - 13:59 #30
Min kode er et standalone program som kan compiles og køres med
enhver JDK.

(den kunne sikkert laves om til en applet, men det vil tage
lidt tid)

Hvad sprog bruger du ?
Avatar billede arne_v Ekspert
28. januar 2003 - 14:01 #31
Det betyder at min 13:18:11 løsning og Arnvigs 13:26:23 løsning
(og alle tidligere) ikke kan bruges, fordi de genererer et
tilfældigt tal 1..99 og transformerer fuldstændigt entydigt op
til 100000..150000.
Avatar billede daniel_d Nybegynder
28. januar 2003 - 14:02 #32
Jeg koder mest til web, altså asp,html,javscript,access
har arbejdet lidt i Delphi, men kendskabet er begrænset

/mvh
Avatar billede arne_v Ekspert
28. januar 2003 - 14:03 #33
Mine senere forslag som:
  initaliserer random generatoren med et bruger input 1..99
  genererer et eller flere tilfældig tal 100000..150000 med den generator
burde være OK.
Avatar billede arne_v Ekspert
28. januar 2003 - 14:06 #34
Det kan godt skrives om til delphi.
Avatar billede daniel_d Nybegynder
28. januar 2003 - 14:13 #35
arne v> Det kan godt skrives om til delphi
Det lyder godt :o)
men hvordan LOL

Du er i hvert fald min redningsmand i dag :o)
Jeg er da kommet et skridt videre

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 14:17 #36
Jeg har delphi 6 enterprise - vil prøve at installere det igen... Det er dog langt tid siden jeg har arbejdet objekt orienteret

/mvh
Avatar billede arne_v Ekspert
28. januar 2003 - 14:24 #37
(efter hukommelsen - jeg har ikke Delphi her)

program Test;

function aRandom(D : integer) : integer;

begin
  aRandom := 100000 + Random(D + 1);
end;

var
  myseed : integer;

begin
  write('Enter number: ');
  readln(myseed);
  RandSeed := myseed;
  for i := 1 to 50 do begin
      writeln(aRandom());
  end;
end.

eller:

program Test;

function aRandom(D : integer) : integer;

begin
  aRandom := 100000 + Random(D + 1);
end;

var
  myseed : integer;

begin
  write('Enter number: ');
  readln(myseed);
  RandSeed := GetTickCount() + myseed;
  for i := 1 to 50 do begin
      writeln(aRandom());
  end;
end.
Avatar billede arne_v Ekspert
28. januar 2003 - 14:25 #38
Ja - der ,angler nok nogle USE et eller andet. Jeg kan checke
i aften derhjemm.
Avatar billede daniel_d Nybegynder
28. januar 2003 - 14:27 #39
Arne>
Jeg takker mange gange... I gang med at installere nu. Glæder mig til at teste dig forslag.

Jeg kan ikke se andet end som at du render af med sejren
Tak

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 14:36 #40
arne> det må du meget gerne... Lyder som om du har MEGET mere styr på det end jeg...

/mvh
Avatar billede arnvig Nybegynder
28. januar 2003 - 15:08 #41
Daniel_d: Det her er ikke en konkurrence, hvor nogen kan løbe af med sejren. Det er et forum hvor man kan søge hjælp på diverse spørgsmål. Hvis du opfatter det som en konkurrence eller et spil, skal du nok ikke regne med at ret mange gider hjælpe dig i længden. Det er godt etikette at dele point mellem bidragsyderne, naturligvis efter fortjeneste.
Læg desuden mærke til at det er vigtigt hvordan et spørgsmål bliver formuleret og at du beskriver hvad du vil opnå.
Avatar billede daniel_d Nybegynder
28. januar 2003 - 15:41 #42
arnvig> Du må undskyld hvis jeg har formuleret det som værende en konkurrence. Det var ikke meningen. Det jeg mente var at Arne Vs bidrag var det som løste mit problem.

Jeg er godt klar over, og betragter på ingen måde, eksperten som værende en konkurrence eller et spil. Jeg er utrolig glad for Eksperten og taknemmelig ud over det sædvanelige for al den hjælp jeg har fået her igennen tiden.

Jeg er ligeledes klar over hvor vigtigt det er at formulere et spørgsmål korrekt, hvilket jeg måske ikke har været god nok til i denne situation.

Hvad angår point er jeg heller ikke uenig med dig. Da jeg skrev at Arne løb af med sejren mente jeg at han naturligvis skulle have flest point.
Dermed siger jeg ikke at du ikke har hjulpet mig, for det har du jo. Jeg værdsætter meget at du har taget tid til at hjælpe mig, selvom det ikke var dit svar det løste mit problem.

Tit har jeg givet folk point selvom jeg har løst mit problem selv, netop fordi de har taget sig tid til at prøve at hjælpe mig. Så jeg er ked af hvis det jeg skrev blev fejlfortolket.

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 15:54 #43
Jeg smed lidt flere point i hatten således at
Arnvig fik 30 og
Arne V fil 60

Jeg syntes at 60 var for lidt, idet disse svar har hjulpet mig meget

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 16:20 #44
Arne>

Jeg ku forestille mig at det kunne se ud som følgende: Dog synes jeg at have problemer med at få din funktion ind i koden:

unit RandomTal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ButtonBeregn: TButton;
    EditStartValue: TEdit;
    EditEndValue: TEdit;
    EditSeedValue: TEdit;
    EditResult: TEdit;
    LabelStartValue: TLabel;
    LabelEndValue: TLabel;
    LabelSeed: TLabel;
    LabelResult: TLabel;
    ButtonQuit: TButton;
    ButtonSlet: TButton;
    LabelVindertal: TLabel;
    MemoVindertal: TMemo;
    procedure ButtonBeregnClick(Sender: TObject);
    procedure ButtonQuitClick(Sender: TObject);
    procedure ButtonSletClick(Sender: TObject);
    procedure MemoVindertalChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ButtonBeregnClick(Sender: TObject);
var S,E,L,R: Single;
begin
  {
  S = StartValue
  E = EndValue
  L = SeedValue
  R = ResultValue
  }

  S:= strToFloat(EditStartValue.Text);
  E:= strToFloat(EditEndValue.Text);
  L:= strToFloat(EditSeedValue.Text);
  R:= (S+E+L);{Selve udregningen}
  EditResult.Text:= FloatTostr(R);

end;

procedure TForm1.ButtonQuitClick(Sender: TObject);
begin
  close;
end;

procedure TForm1.ButtonSletClick(Sender: TObject);
begin
  EditStartValue.Text:='';
  EditEndValue.Text:='';
  EditSeedValue.Text:='';
  EditResult.Text:='';
end;

procedure TForm1.MemoVindertalChange(Sender: TObject);
begin
  {her skal vindertallene f.eks. 50 forskellige listes}
end;

end.


/mvh
Avatar billede arnvig Nybegynder
28. januar 2003 - 16:24 #45
Daniel_d: Det er ok, takker for point.
Avatar billede daniel_d Nybegynder
28. januar 2003 - 16:27 #46
;o)
Avatar billede daniel_d Nybegynder
28. januar 2003 - 16:29 #47
EditResult skulle vel slet ikke være der når MemoVindertal skal vise vindertallene...
Avatar billede arne_v Ekspert
28. januar 2003 - 16:43 #48
Funktionen skal vel bare ligges ind.

F.eks. inden i ButtonBeregnClick.
Avatar billede arne_v Ekspert
28. januar 2003 - 16:56 #49
[nedenstående kodet uden Delphi, så der er sikkert
lidt syntax fejl]

procedure TForm1.ButtonBeregnClick(Sender: TObject);

var
  S,E,L,R: longint;

begin
  S:= strToLongInt(EditStartValue.Text);
  E:= strToLongInt(EditEndValue.Text);
  L:= strToLongInt(EditSeedValue.Text);
  RandSeed := L;
  R := S + Random((E - S) + 1);
  EditResult.Text:= LongIntTostr(R);

end
Avatar billede arne_v Ekspert
28. januar 2003 - 16:56 #50
Jeg kan checke det når jeg kommer hjem til min Delphi.
Avatar billede daniel_d Nybegynder
28. januar 2003 - 17:08 #51
Den forstår i hvert fald ikke strToLongInt, men jeg leget lidt videre med det

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 17:14 #52
har lavet det om til en Integer hvor det virker delvist forstået på den måde at den udskriver et tilfældigt tal i min Memo, men bedre var det hvis der blev udskrevet 50 tal i min Memo og at tilfældigheden også blev baseret på tiden...

Jeg prøver at smide det i en .zip og lægger det på nettet senere. Så kan du evt bedre se hvor jeg ønsker at komme hen

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 18:00 #53
jeg har lagt min delphi projektmappe på www.d-form.dk/test/randomtal.zip
Avatar billede arne_v Ekspert
28. januar 2003 - 18:51 #54
Jeg har hentet det og eksperimenteret lidt.

Følgende kode genererer 50 tal og viser dem:

procedure TForm1.ButtonBeregnClick(Sender: TObject);
var S,E,L,R,I: Integer;
begin
  {
  S = StartValue
  E = EndValue
  L = SeedValue
  R = ResultValue
  }

  S:= strToInt(EditStartValue.Text);
  E:= strToInt(EditEndValue.Text);
  L:= strToInt(EditSeedValue.Text);
  RandSeed:=L;
  MemoVindertal.Text:= '';
  for I := 1 to 50 do begin
    R:= S+Random((E-S)+1);
    MemoVindertal.Text:= MemoVindertal.Text + IntTostr(R) + chr(13) + chr(10);
  end;

end;
Avatar billede daniel_d Nybegynder
28. januar 2003 - 19:01 #55
Kigger straks på det

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 19:07 #56
Det er jo helt kanon...
Det virker faktisk.
Hvad skal der til for at bruge klokken som endnu en "seed" ?
og er det muligt i delphi at gøre dette ?

/mvh
Avatar billede arne_v Ekspert
28. januar 2003 - 19:10 #57
procedure TForm1.ButtonBeregnClick(Sender: TObject);
var S,E,L,R,I: Integer;
begin
  {
  S = StartValue
  E = EndValue
  L = SeedValue
  R = ResultValue
  }

  S:= strToInt(EditStartValue.Text);
  E:= strToInt(EditEndValue.Text);
  L:= strToInt(EditSeedValue.Text);
  RandSeed:=GetTickCount() + L;
  MemoVindertal.Text:= '';
  for I := 1 to 50 do begin
    R:= S+Random((E-S)+1);
    MemoVindertal.Text:= MemoVindertal.Text + IntTostr(R) + chr(13) + chr(10);
  end;

end;
Avatar billede daniel_d Nybegynder
28. januar 2003 - 19:33 #58
Jamen dog...
2 sek - skal lige prøve...

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 19:43 #59
Det virker perfekt... Kunne ikke være bedre

Jeg takker og bukker
/mvh
Daniel
Avatar billede daniel_d Nybegynder
28. januar 2003 - 20:01 #60
Lige en sidste...
hvad ligger der bag
chr(13)
chr(10)
??

/mvh
Avatar billede daniel_d Nybegynder
28. januar 2003 - 20:04 #61
bare tallet 13 og 10 ?
Avatar billede arne_v Ekspert
28. januar 2003 - 20:19 #62
13=CR
10=LF
CRLF=linieskift
Avatar billede arne_v Ekspert
28. januar 2003 - 20:20 #63
chr konverterer fra integer til char.
Avatar billede daniel_d Nybegynder
28. januar 2003 - 20:23 #64
ahhh ok...tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester