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

私はまだパブでの同行を持っているという事実を除いて、コードを試してみました。 Pub1 = 4、Pub2 = 4、Pub3 = 3、Pub4 = 8と同様に、主なアイデアは、すべての数字を違うものにすること、そしてFoxProを使うことです。私はどのように理解できませんでした。 –

+0

あなたのリビジョンを投稿してください。 – Missy

答えて

1

あなたはint(rand()* 10)+ 1を使用しています.1から10の間の乱数を選択することを目的とするVFPまたは他の言語であれば、それは一意でなければならない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 

Select A、Select Bスタイルのコーディングは危険です。代わりにエイリアスを使用してください。

+0

PUB1-4でエラーが発生している理由を理解できません。(変数 'PUB1'が見つかりません。) –

+1

ああ、そこにテストがありません。私の編集を参照してください。 –

関連する問題