Estimados Amigos...llevo varios días programando un sin fin de cosas... y tengo el siguiente problema.
Necesito dividir un Numero X en Z partes desiguales... por ejemplo
10.000 dividirlo en 13 partes desiguales....
10.000 dividirlo en 10 partes desiguales....
Me comentaron algo de una función RANDOM o algo así pero no logro dar con un ejemplo claro... o sera que estoy muy cansado... Agradecería. una mano amiga...
Saludos.
Moisés
CONSULTA URGENTE!!! RANDOM
Re: CONSULTA URGENTE!!! RANDOM
Amigo Ozono, no se entiende muy bien que es lo que estás preguntando. Supongo que necesitas generar un número aleatorio para tu división en partes desiguales.
Para ello está la función nRandom(x) que genera un número aleatoio entre 0 y x. Por ejemplo:
Genera un número entre 0 y 10. Si lo que quieres es, por ejemplo, un número entre 10 y 15 pues tendrás que poner:
nRandom(5) te dará un número aleatorio entre 0 y 5 que al sumarle 10 resultará un número entre 10 y 15.
Espero te sea de ayuda
Un saludo
Para ello está la función nRandom(x) que genera un número aleatoio entre 0 y x. Por ejemplo:
Code: Select all
nNum := nRandom(10)
Code: Select all
nNum := nRandom(5)+10
Espero te sea de ayuda
Un saludo
Peaaaaaso de foro...
Re: CONSULTA URGENTE!!! RANDOM
Moises, a ver si me he enterado, y te puede servir estoozono1981 wrote:Estimados Amigos...llevo varios días programando un sin fin de cosas... y tengo el siguiente problema.
Necesito dividir un Numero X en Z partes desiguales... por ejemplo
10.000 dividirlo en 13 partes desiguales....
10.000 dividirlo en 10 partes desiguales....
Me comentaron algo de una función RANDOM o algo así pero no logro dar con un ejemplo claro... o sera que estoy muy cansado... Agradecería. una mano amiga...
Saludos.
Moisés
Code: Select all
#include "fivewin.ch"
Function Main()
Local aNum := {}
Local x := 0
Local nSum := 0
Local y := 0
Local nNum := 10000 // cambiar a peticion del usuario
Local nAcum := 0
Local nPartes := 10 // cambiar a peticion de usuario
Do while .t.
x = nRandom( nNum )
if Ascan( Int( x ), aNum ) = 0
if ( nSum + Int( x ) ) < nNum
AADD( aNum, Int( x ) )
nSum += Int( x )
endif
endif
if Len( aNum ) = nPartes - 1
exit
endif
Enddo
x := nNum - nSum
AAdd( aNum, x )
For y = 1 to Len( aNum )
nAcum += aNum[ y ]
? y, aNum[ y ], nAcum
Next y
Return nil
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Re: CONSULTA URGENTE!!! RANDOM
Una version mejorada (creo), seguro que se puede hacer mejor, no lo he probado a fondo
Code: Select all
#include "fivewin.ch"
Function Main()
Local aNum := {}
Local x := 0
Local nSum := 0
Local y := 0
Local nNum := 10000
Local nAcum := 0
Local nPartes := 10
// Estas variables son por si las partes quieres que esten
// entre dos valores concretos. Por defecto:
// Si no se cumple la condicion: repetir la iteracion (usar con cuidado, sino, entraria en un bucle infinito)
Local nValor1 := 1
Local nValor2 := nNum
Do While .t.
Do while .t.
x = nRandom( nNum )
if Int( x ) >= nValor1 + 1 .and. Int( x ) <= nValor2
if Ascan( Int( x ), aNum ) = 0
if ( nSum + Int( x ) ) < nNum
AADD( aNum, Int( x ) )
nSum += Int( x )
endif
endif
if Len( aNum ) = nPartes - 1
exit
endif
endif
Enddo
x := nNum - nSum
if Ascan( Int( x ), aNum ) = 0
AAdd( aNum, x )
Exit
else
aNum := {}
nSum := 0
x := 0
nAcum := 0
endif
Enddo
For y = 1 to Len( aNum )
nAcum += aNum[ y ]
? y, aNum[ y ], nAcum
Next y
Return nil
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
Re: CONSULTA URGENTE!!! RANDOM
Ozono,
Haber si esto te puede ayudar. Escribo directamente el código sin probarlo.
Espero que funcione, o en cualquier caso te de ideas.
Saludos.
Lorenzo
desde Cádiz, España.
Haber si esto te puede ayudar. Escribo directamente el código sin probarlo.
Code: Select all
funct dividir(nNum,nPartes) && nNum=Numero a dividir (dividendo)
Local nResultado:={0}
Local nCocienteFijo:=0
Local nVariacion:=0
Local lpar
Local nSuma:=0
default nNum:=1, nPartes:=1
nCocienteFijo=Round(nNum/nPartes,2) && con 2 decimales
if nPartes=1
nResultado[1]=nNum
else
for x=1 to nPartes-1
nResultado[x]=Random(nCocienteFijo,2)
nSuma+=nResultado[x]
next
endif
nResultado[nPartes]=nNum-nSuma
return nResultado
Saludos.
Lorenzo
desde Cádiz, España.
Re: CONSULTA URGENTE!!! RANDOM
Gracias A Todos Amigos... voy a trabajar en las pruebas y les comento, desde ya mis mas sinceras
GRACIAS!!!!
Un Abrazo.
GRACIAS!!!!
Un Abrazo.
Re: CONSULTA URGENTE!!! RANDOM
Muchacho Muchas Gracias por la ayuda prestada, acabo de terminar lo que me tuvo pegado varios días así que muy agradecido de verdad.
Saludos Cordiales desde Chile
Moisés
Saludos Cordiales desde Chile
Moisés
Re: CONSULTA URGENTE!!! RANDOM
Ozono, si en vez de nNum := nRandom( nRand ) escribes: nNum := nRandom( nRand )+1 te aseguras de que nunca te va a dar 0 y te quitas de complicaciones
Un saludo. Y suerte...
Un saludo. Y suerte...
Peaaaaaso de foro...