FoxPro/Visual FoxPro - generar numeros aleatorios

 
Vista:
sin imagen de perfil

generar numeros aleatorios

Publicado por lorena (14 intervenciones) el 01/04/2016 01:48:12
Hola amigos .
Tengo un problema con la funcion rand , tratare de explicarlo ;
Tengo una tabla socios Con codigo y nombres .
Todo los meses genero una nueva tabla pero cambio siempre el codigo con un numero al azar (esto se hace para realizar un sorteo etc etc .

utilizo la siguiente instrucción : * ELIGE UN NUMERO
numero = 1000 + INT(RAND() * 9000) y todo esto funciona perfecto .
El problema es que cada 12 tablas me vuelve a repetir la secuencia de numeros que eligio antes .
Quiero decir que la tabla 1 = 12 las 2 a la 13 , la 3 a la 14 y asi sucesivamente .
Necesito que nunca una tabla sea igual a la otra y la verdad no se por que pasa esto .
Desde ya muchas gracias .
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

generar numeros aleatorios

Publicado por Fidel José (657 intervenciones) el 01/04/2016 16:17:56
Necesitas definir correctamente el entorno e iniciar el ciclo con un valor semilla.
Mira el siguiente ejemplo
Se puede citar como
Do_Random(1,99)
Do_Random(51,99)
Do_Random(1,999)
Do_Random(8001,9999)

En el ejemplo se controla que todos los ordenes tengan un número de sorteo y que los números de sorteo no ser repitan.
El control de repetición se hace con un Array de números sorteados. El control de integridad, se hace con un bucle que se repite hasta que no queda ningún orden sin su sorteo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
PROCEDURE DO_RANDOM
LPARAMETERS tnMin, tnMax
#DEFINE _CRCL_ 	CHR(13)+CHR(10)
#DEFINE _TAB_ 	CHR(9)
 
LOCAL i,;
	lcString,;
	lnCount,;
	lnDigits,;
	lnMult,;
	lnRand,;
	lnSort,;
	lcFileName
 
LOCAL ARRAY laSort(1)
 
 
lnDigits = LEN(TRANSFORM(tnMax))
lnMult = 10 ^ lnDigits
tnMin = EVL(tnMin,0)
tnMax = EVL(tnMax, lnMult - 1)
lnSort = 0
lcString = "Sorteo "+TTOC(DATETIME(),3) + _CRCL_ ;
	+"Rango Inferior "+PADL(TRANSFORM(tnMin),lnDigits+1," ");
	+ _TAB_ ;
	+"Rango Superior "+PADL(TRANSFORM(tnMax),lnDigits+1," ");
	+ _CRCL_
 
lcFileName = "Sorteo_"+TTOC(DATETIME(),1)+".txt"
 
CREATE CURSOR myRand ("orden" I, "Sorteo" I )
FOR i= tnMin TO tnMax
	INSERT INTO MyRand (orden) VALUES (i)
NEXT
 
 
RAND(-1)	&& semilla
 
DO WHILE .t.
	lnCount = 0
	SELECT MyRand
	SCAN FOR EMPTY(sorteo)
		lnCount = m.lnCount + 1
		lnRand = INT(RAND() * m.lnMult)
		IF BETWEEN(m.lnRand,m.tnMin,m.tnMax) ;
			AND ASCAN(laSort,m.lnRand) = 0
 
			lnSort = m.lnSort + 1
			DIMENSION laSort(m.lnSort)
			laSort[m.lnSort] = lnRand
 
			replace sorteo WITH m.lnRand
		ENDIF
	ENDSCAN
 
	IF m.lnCount = 0
		EXIT
	ENDIF
ENDDO
SELECT MyRand
INDEX on Orden TAG iOrden
INDEX on sorteo TAG isorteo
 
lcString = m.lcString ;
	+ "Por Orden de Sorteo" + _CRCL_
SET ORDER TO iOrden
SCAN
	lcString = m.lcSTring ;
		+ PADL(TRANSFORM(orden),m.lnDigits+1," ");
		+ REPLICATE(_TAB_,2) ;
		+ PADL(TRANSFORM(sorteo),m.lnDigits+1," ");
		+ _CRCL_
 
ENDSCAN
GO top
BROWSE
 
lcString = m.lcString ;
	+ "Por Número de Sorteo" + _CRCL_
SET ORDER TO iSorteo
SCAN
	lcString = m.lcSTring ;
		+ PADL(TRANSFORM(orden),m.lnDigits+1," ");
		+ REPLICATE(_TAB_,2) ;
		+ PADL(TRANSFORM(sorteo),m.lnDigits+1," ");
		+ _CRCL_
 
ENDSCAN
GO top
BROWSE
 
STRTOFILE(m.lcString,m.lcFileName)
MODIFY FILE &lcFileName NOEDIT
 
USE IN myRand
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

generar numeros aleatorios

Publicado por lorena (14 intervenciones) el 01/04/2016 21:23:13
Hola Fidel , siempre tan atento , te agradezco como siempre tu respuesta pero , .... ja ja usted siempre se manda un codigo como para la
NASA y esto es mas sencillo .
"numero = 1000 + INT(RAND() * 9000) "este codigo define que el numero sea entre el 1000 y el 9000 y funciona bien , despues los demas controles de repeticion y demas ya estan echos y tambien funcionan .
Lo que necesito es agregarle algo para que me regule que instruccion numero = 1000 + INT(RAND() * 9000) nunca mas se repita en el tiempo , tengo una tabla de enero y otra echa en diciembre que son identicas . Esto no quiere decir que el "num_cod " del registro 355 de la tabla de enero no sea igual al registro 104 de la de marzo .
Bueno amigazo muchas gracias por su respuestas pero no olvide que no tengo tanto nivel de conocimiento como el suyo .
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

generar numeros aleatorios

Publicado por Fidel José (657 intervenciones) el 02/04/2016 00:04:49
De la ayuda de RAnd: Returns a random number between 0 and 1. (retorna un número aleatorio entre cero y uno.)
Por ejemplo, en una tirada de 10000 números rand(), obtengo este valor: 0.00009745801799
De esto resulta que INT(0.00009745801799 * 9000 ) + 1000 = 1000
Por este motivo se debe controlar la calidad del número obtenido (que esté entre un mínimo y un máximo aceptable) de lo contrario debe ser rechazado.

En cuanto a los rand que salieron en tiradas anteriores, por supuesto que se pueden repetir. Para asegurar el mayor rango (la menor probabilidad de repeticiones) se indica iniciar la rutina con un Rand(-1) y luego ejecutar Rand() (sin parámetro) para obtener el número.

Si lo que generas son tablas con esa numeración, puedes controlar si ya existe una tabla con igual nombre con la función File().

Un ejemplo
Create_Files_rand(7001, 9000 , 500 ) && crea 500 archivos con distinto nombre y números entre 7001 y 9000

Nota: No controlo en esta rutina (debería) la consitencia de los parámetros pasados. La cantida de valores a generar no puede ser mayor que la diferencia entre el mayor y el menor rango.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
PROCEDURE Create_Files_Rand
 
LPARAMETERS tnMin, tnMax , tnFilesToCreate
 
LOCAL i,;
	lnDigits,;
	lnMult,;
	lnRand,;
	lcExt,;
	lcRoot,;
	lcFileName
 
LOCAL ARRAY laSort(1)
 
tnFilesToCreate = EVL(tnFilesToCreate , 1)	&& si se omite el parámetro toma 1
 
 
lnMult = 10 ^ LEN(TRANSFORM(tnMax))
tnMin = EVL(tnMin,0)
tnMax = EVL(tnMax, lnMult - 1)
 
lcRoot = ADDBS(dtemp)+"MyFile_"		&& dtemp es un dir temporal
lcExt = "txt"						&& para el ejemplo.
 
RAND(-1)	&& semilla
 
FOR i = 1 TO m.tnFilesToCreate
	DO WHILE .t.
		lnRand = INT(RAND() * m.lnMult)
		IF BETWEEN(m.lnRand,m.tnMin,m.tnMax)        && asegura que el número Rand() tenga la calidad requerida.
			lcFileName = FORCEEXT(m.lcRoot+TRANSFORM(lnRand),m.lcExt )
			IF !FILE(m.lcFileName)           && si no encuentra un archivo de igual nombre, genera el archivo y sale
				STRTOFILE("Rand Sample "+TRANSFORM(DATETIME())+CHR(13),m.lcFileName)
				EXIT
			ENDIF
		ENDIF
	ENDDO
NEXT
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

generar numeros aleatorios

Publicado por lorena (14 intervenciones) el 02/04/2016 02:44:57
muy pero muy bueno .
Gracias mil
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar