Page 1 of 1

CONSULTA URGENTE!!! RANDOM

Posted: Tue Oct 22, 2013 3:11 am
by ozono1981
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

Re: CONSULTA URGENTE!!! RANDOM

Posted: Tue Oct 22, 2013 6:56 am
by antolin
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:

Code: Select all

nNum := nRandom(10)
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:

Code: Select all

nNum := nRandom(5)+10
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

Re: CONSULTA URGENTE!!! RANDOM

Posted: Tue Oct 22, 2013 8:21 am
by cnavarro
ozono1981 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
Moises, a ver si me he enterado, y te puede servir esto

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

 

Re: CONSULTA URGENTE!!! RANDOM

Posted: Tue Oct 22, 2013 8:37 am
by cnavarro
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

 

Re: CONSULTA URGENTE!!! RANDOM

Posted: Tue Oct 22, 2013 11:03 am
by Loren
Ozono,

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
Espero que funcione, o en cualquier caso te de ideas.

Saludos.
Lorenzo
desde Cádiz, España.

Re: CONSULTA URGENTE!!! RANDOM

Posted: Tue Oct 22, 2013 3:12 pm
by ozono1981
Gracias A Todos Amigos... voy a trabajar en las pruebas y les comento, desde ya mis mas sinceras

GRACIAS!!!!

Un Abrazo.

Re: CONSULTA URGENTE!!! RANDOM

Posted: Wed Oct 23, 2013 3:35 pm
by ozono1981
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

Re: CONSULTA URGENTE!!! RANDOM

Posted: Fri Oct 25, 2013 10:44 am
by antolin
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...