2016-09-21 3 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. Будь то VFP или любой другой язык, вы намерены выбрать случайное число от 1 до 10. В вашем коде ничего не сказано, что оно должно быть уникальным Pub1, Pub2, ... Нормально, что повторные вызовы rand могут возвращать одинаковое значение, когда вы выбираете 4 значения из max 10. Вместо этого вы могли бы сделать что-то вроде этого (непроверенные с верхней части моей головы):

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

Oh Выберите там тест. См. Мое редактирование. –