2016-09-21 88 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

哦选择测试在那里丢失。看我的编辑。 –