2016-09-21 87 views
0

有人可以幫忙,尋找唯一的隨機生成的數字。 當前有4個酒吧,如果數據超過4個酒吧,則需要隨機選擇酒吧並將該值放到Pub1 Pub2 Pub3和Pub4字段中。通過使用FoxPro找不到解決方案。FoxPro唯一隨機數

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 

如果有什麼是不可理解的,請讓我知道。

+0

rand()是隨機數發生器。使用-1初始化以獲得最大分佈。我會修改你的代碼,但這是不可理解的。應該給錯誤。 –

+0

我已經嘗試過代碼,workig很好,除了我仍然在pubs中發佈的事實。像Pub1 = 4,Pub2 = 4,Pub3 = 3,Pub4 = 8。主要想法是使所有數字不同,並通過使用FoxPro ..我無法理解如何。 –

+0

請發佈您的修訂。 – Missy

回答

1

您正在使用int(rand()* 10)+ 1.是VFP還是任何其他語言,您的意圖是選擇一個介於1到10之間的隨機數。代碼中沒有任何內容說明它應該是唯一的Pub1,Pub2,...當你從最大值10中選擇4個值時,重複調用rand可能會返回相同的值,這是正常的。相反,你可以做這樣的事情(未經測試從頭頂開始):

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 

請注意,選擇A,選擇B樣式編碼是危險的。改用別名。

+0

不明白爲什麼PUB1-4存在錯誤(變量'PUB1'未找到。) –

+1

哦選擇測試在那裏丟失。看我的編輯。 –