FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour CONSULTA URGENTE!!! RANDOM
Posts: 39
Joined: Tue Mar 26, 2013 02:09 PM
CONSULTA URGENTE!!! RANDOM
Posted: Tue Oct 22, 2013 03:11 AM

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

Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: CONSULTA URGENTE!!! RANDOM
Posted: Tue Oct 22, 2013 06:56 AM
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 (fw): Select all Collapse
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 (fw): Select all Collapse
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
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: CONSULTA URGENTE!!! RANDOM
Posted: Tue Oct 22, 2013 08:21 AM
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 (fw): Select all Collapse
#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
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: CONSULTA URGENTE!!! RANDOM
Posted: Tue Oct 22, 2013 08:37 AM
Una version mejorada (creo), seguro que se puede hacer mejor, no lo he probado a fondo

Code (fw): Select all Collapse
#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
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 479
Joined: Fri Feb 16, 2007 10:29 AM
Re: CONSULTA URGENTE!!! RANDOM
Posted: Tue Oct 22, 2013 11:03 AM
Ozono,

Haber si esto te puede ayudar. Escribo directamente el código sin probarlo.

Code (fw): Select all Collapse
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.
Posts: 39
Joined: Tue Mar 26, 2013 02:09 PM
Re: CONSULTA URGENTE!!! RANDOM
Posted: Tue Oct 22, 2013 03:12 PM

Gracias A Todos Amigos... voy a trabajar en las pruebas y les comento, desde ya mis mas sinceras

GRACIAS!!!!

Un Abrazo.

Posts: 39
Joined: Tue Mar 26, 2013 02:09 PM
Re: CONSULTA URGENTE!!! RANDOM
Posted: Wed Oct 23, 2013 03:35 PM

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

Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: CONSULTA URGENTE!!! RANDOM
Posted: Fri Oct 25, 2013 10:44 AM

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...

Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55

Continue the discussion