La cuestión es la siguiente:
me creo una base de datos llamada juego, con un campo numero, de dos dígitos. llamado numero.
me creo un indice del campo numero
genero un numero aleatorio con una de las dos funciones, si es mayor que 90 lo descarto
si es menor que 1 también.
una vez aceptado el numero al estar comprendido entre 1 y 90 compruebo a través del indice si este numero ya esta escrito en la dbf, si no añado un campo y lo escribo.
de esta forma tendré una dbf con 90 registros con un numero del 1 al 90 de forma aleatoria.
luego leo seguencialmente la dbf sin el indice.
el problema es que con ambas funciones hay números que siempre me los repite en los ultimas posiciones.
***************************
* -------------------------------------------------------------------- *
* *
* Randint() (l) Copyleft 2001 Gabriel Tarela Gandini. *
* Montevideo - Uruguay. ->
[email protected] *
* Any rights reserved. *
* *
* -------------------------------------------------------------------- *
* ¨ Para que sirve ? *
* *
* Devuelve un numero entero aleatorio en un rango especifico *
* *
* Parametros: *
* nDesde : Margen inferior *
* nHasta : Margen superior *
* *
* Devuelve -> Un valor numerico entero aleatorio *
* *
* Precondiciones: *
* *
* Debe establecerce los decimales a 16 por lo menos antes de realizar *
* un llamado a randint() ya que esta utiliza las posiciones decimales *
* para generar el numero aleatorio. *
* *
* El parametro nHasta debe ser mayor que nDesde. *
* *
* Ejemplo: *
* *
* set decimals to 16 *
* *
* while lastkey() <> 27 *
* inkey(.2) *
* ?randint( 2500,10000 ) *
* end *
* *
* Mas informacion ->
[email protected] *
* -------------------------------------------------------------------- *
function randint ( nDesde,nHasta )
static nultimo
local nRandom := 0
local nMult := int(seconds())
local nNumero := nHasta - nDesde
local nlen := len(alltrim(str(nNumero)))
if valtype(nultimo) <> "N" .or. nultimo = 0
nultimo := (nMult * ((seconds() - int(seconds())) * 100)) % 335544319
endif
nultimo := (nMult * nultimo) % 335544319
nRandom := val(right(str(nultimo / 335544319),nlen))
if nRandom > nnumero
nRandom := nnumero - val(right(str(nRandom),len(alltrim(str(nnumero)))-1))
endif
return nDesde + int(nRandom)
*----------------------------------------------------------------------------------
******FUNCION QUE GENERA NUMEROS ALEATORIOS
******EJEMPLO
**** N=RAND()
**** N ES INGUAL A UN NUMERO ALEATORIO
*****************************************************
FUNCTION RAND && FUNCION DE NUMERO ALEATORIOS USA
PARAMETERS SEMILLA && LA FUNCION STRINV
IF PCOUNT()=0
PRIVATE SEMILLA
SEMILLA=VAL(STRINV(STR(SECONDS())))
ENDIF
PRIVATE AUX
AUX=LOG(SEMILLA)
RETURN AUX-INT(AUX)
***********************************************************************
FUNCTION STRINV && SIRVE PARA OBTENER LA INVERSA DE UNA CADENA
PARAMETERS CAD
PRIVATE LONG,IND
LONG=LEN(CAD)
CAD=SUBSTR(CAD,2,LONG-1)+SUBSTR(CAD,1,1)
FOR IND=LONG TO 3 STEP -1
CAD=SUBSTR(CAD,2,IND-2)+SUBSTR(CAD,1,1)+SUBSTR(CAD,IND,LONG-IND+1)
NEXT
RETURN CAD
**************************PROCEDURE MOVER BOLAS********************
PROCEDURE MOVEBOLA
LOCAL cColor := "N/BG,W+/R,,,W+/B"
CONTABOLA=0
VARI=1
DO WHILE lastkey() <> 27
*IF VARI=1
* @ 23,1 SAY "ENTRO EN UNO"
* VARI=2
* N=RAND()
* N=INT(N*100)
*ELSE
* @ 23,1 SAY "ENTRO EN DOS"
* VARI=1
* desde=-1000000
* hasta=1000000
* n=randint(desde,hasta)
*ENDIF
********
N=CRAND(1000)
********
IF N > 90 .OR. N < 1
LOOP
ENDIF
SEEK N
@ 15,30 SAY "BOLAS QUE FALTAN"
PAPA=CONTABOLA-90
@ 17,30 SAY ABS(PAPA)
IF FOUND()
LOOP
ELSE
APPEND BLANK
REPLACE NUME WITH N
CONTABOLA=CONTABOLA+1
ENDIF
IF CONTABOLA = 90
INKEY(N/100)
RETURN
ENDIF
ENDDO
RETURN
***************************************