2016-09-21 18 views
0

Könnte jemand helfen, Suche nach Einmalig zufällig generierte Nummer. Momentan haben 4 Pubs, wenn Daten mehr als 4 Pubs haben, müssen die Pubs nach dem Zufallsprinzip ausgewählt und der Wert in die Pub1 Pub2 Pub3 und Pub4 Felder gesetzt werden. Lösung kann nicht gefunden werden, indem FoxPro verwendet.FoxPro Einmalige Zufallszahl

SELE A 
USE TEST 
REPL PUB1 WITH "" ALL 
REPL PUB2 WITH "" ALL 
REPL PUB3 WITH "" ALL 
REPL PUB4 WITH "" ALL 
REPL RANDOM1 WITH "" ALL 
REPL RANDOM2 WITH "" ALL 
REPL RANDOM3 WITH "" ALL 
REPL RANDOM4 WITH "" ALL 
REPL RANDOMLOG WITH "" ALL 

SELE B 
USE WHATPUB 

SELE A 
GO TOP 
DO WHILE !EOF() 
    cBRANCH=BRANCH 
    SELE B 
    SET FILTER TO BRANCH=cBRANCH 
    COUN TO nBRANCHQTY 

    IF nBRANCHQTY<=4 
     FOR loop=1 TO nBRANCHQTY 
      SELE B 
      LOCA FOR loop=FT_URN 
      IF FOUND() 
       cPUBID=PUBID 
       SELE A 
       cFLD1="PUB"+LTRIM(STR(loop)) 
       REPL (cFLD1) WITH cPUBID 
      ENDIF 
     NEXT loop 

    ELSE 

     SELE A 


     FOR loop=1 TO 4 
      SELE A 



      DO WHILE nRANDOMPUB>nBRANCHQTY 
       nRANDOMPUB=INT(RAND()*10)+1  
      ENDDO 


      SELE B 
      LOCATE FOR nRANDOMPUB=FT_URN 

      IF FOUND() 
       cPUBID=PUBID 
       SELE A 
       cFLD1="PUB"+LTRIM(STR(loop)) 
       cFLD2="RANDOM"+LTRIM(STR(loop)) 

       REPL (cFLD1) WITH cPUBID 
       REPL (cFLD2) WITH LTRIM(STR(nRANDOMPUB)) 
      ENDIF 

      nRANDOMPUB=9999999 

     NEXT loop 

    ENDIF 

    SELE A 
    SKIP 

ENDDO 

GO TOP 
BROW FIELDS BRANCH,RANDOMLOG,RANDOM1,PUB1,RANDOM2,PUB2,RANDOM3,PUB3,RANDOM4,PUB4 

Wenn etwas nicht verständlich ist, lass es mich wissen.

+0

rand() ist der Zufallszahlengenerator. Seed es mit -1 zunächst, um die maximale Verteilung zu erhalten. Ich würde Ihren Code überarbeiten, aber es ist nicht verständlich genug. Sollte einen Fehler geben. –

+0

Ich habe versucht Code, funktioniert gut, außer der Tatsache, dass ich noch in Pubs. Wie Pub1 = 4, Pub2 = 4, Pub3 = 3, Pub4 = 8. Die Hauptidee ist, alle Zahlen anders zu machen, und FoxPro zu benutzen .. Ich konnte nicht verstehen, wie. –

+0

Bitte posten Sie Ihre Revisionen. – Missy

Antwort

1

Sie verwenden int (rand() * 10) + 1. Sei es VFP oder eine andere Sprache Ihre Absicht ist es, eine zufällige Zahl zwischen 1 und 10 zu wählen. Es gibt nichts in Ihrem Code, der besagt, dass es eindeutig sein sollte Pub1, Pub2, ... Es ist normal, dass wiederholte Aufrufe von rand denselben Wert zurückgeben können, wenn Sie 4 Werte von max. 10 auswählen. Stattdessen können Sie etwas ähnliches tun (ungeprüft am oberen Rand meines Kopfes):

Create Cursor crsRand (pubVal i) 
Local ix 
For ix = 1 To 10 
    Insert Into crsRand Values (m.ix) 
Endfor 

Rand(-1) 

Select 0 
Use TEST 
Replace PUB1 With "", ; 
    PUB2 With "", ; 
    PUB3 With "", ; 
    PUB4 With "", ; 
    RANDOM1 With "", ; 
    RANDOM2 With "", ; 
    RANDOM3 With "", ; 
    RANDOM4 With "", ; 
    RANDOMLOG With "" All 

Use WHATPUB In 0 

Local cBRANCH, nBranch, nBRANCHQTY, Loop, cPubId, cFld1 
Local Array laRandPub[1] 

Select TEST 
Scan 
    cBRANCH=BRANCH 
    Select WHATPUB 
    Count For BRANCH=m.cBRANCH To nBRANCHQTY 

    If m.nBRANCHQTY<=4 
     Select WHATPUB 
     For Loop=1 To m.nBRANCHQTY 
      Locate For FT_URN=m.loop 
      If Found() 
       cPubId=PUBID 
       Select TEST 
       cFld1="PUB"+Ltrim(Str(m.loop)) 
       Replace (m.cFld1) With m.cPubId 
      Endif 
     Endfor 
    Else 
     Select pubVal From ; 
      (Select Top 4 pubVal, Rand() From crsRand Where pubVal <= m.nBRANCHQTY Order By 2) tmp ; 
      into Array laRandPub 

     For Loop=1 To 4 
      Select WHATPUB 
      Locate For FT_URN=laRandPub[m.loop] 
      If Found() 
       select Test 
       cPubId=PUBID 
       cFld1="PUB"+Ltrim(Str(m.loop)) 
       cFLD2="RANDOM"+Ltrim(Str(m.loop)) 

       Repl (m.cFld1) With m.cPubId, (m.cFLD2) With Ltrim(Str(laRandPub[m.loop])) 
      Endif 
     Endfor 
    Endif 
Endscan 

Locate 
Brow Fields BRANCH,RANDOMLOG,RANDOM1, ; 
      PUB1,RANDOM2,PUB2,RANDOM3,PUB3,RANDOM4,PUB4 

Beachten Sie, dass die Auswahl von A, Select B-Stil gefährlich ist. Verwenden Sie stattdessen Aliase.

+0

Verstehe nicht, warum es einen Fehler mit PUB1-4 gibt, (Die Variable 'PUB1' wurde nicht gefunden.) –

+1

Oh Select Test fehlt dort. Siehe meine Bearbeitung. –