Selección Aleatoria

28/07/2005 - 18:15 por Marvin | Informe spam
Que tal grupo,

tengo una tabla con 30 registros, UNO, DOS, TRES, CUATRO, CINCO etc, de los
cuales quiero buscar cada uno en otra tabla, filtrarla por ese registro, osea
todos aquellos que sean UNO, todos los que sean DOS, y así sucesivamente

Supongamos que ya esta filtrada por el UNO, deseo que en otra columna me
agregue un identificativo, supongamos una "X" a 20 registros elegidos
ALEATORIAMENTE, que del total de los registros filtrados marque en otra
columna 20 registros al azar, . cómo puedo hacerlo?, gracias

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
29/07/2005 - 05:17 | Informe spam
hola, Marvin !

... una tabla con 30 registros... de los cuales quiero buscar cada uno en otra tabla
... filtrarla por ese registro
... ya... filtrada... que en otra columna... del total de los registros filtrados marque... 20 registros al azar



[hasta donde se]... para que una seleccion 'aleatoria'... resute ser... 'verdaderamente aleatoria'...
necesitas un algoritmo/codigo que 'salte elementos aleatoriamente' y... 'marque -tambien- aleatoriamente'
necesitaras tambien 'cuidar' de que no se ejecute si el numero de elementos 'seleccionables' es inferior a la 'marca'
-> para filtrar 30 veces 20... podria 'asumirse' que el listado 'grande' tiene al menos 20 de cada uno [>= ~700] ?
una cuestion que [seguramente] haria que la ejecucion del codigo sea 'leeennnta'...
-> es SI deseas que la tabla 'filtrable' se siga conservando como una sola entidad/tabla/hoja/... -?-
[a menos que resultara 'aceptable' que el registro_filtrado_UNO se pase a la Hoja_UNO -y asi sucesivamente-] -?-
tambien seria de utilidad si comentas...
-> cuantas columnas [o campos] hay en las tablas ? [y los rangos/hojas donde se ubican]
[a menos que quieras que el codigo 'las detecte' -si fuera el caso de que son 'variables'-] -?-
-> cual columna/campo es el que se filtra ?

comentas cualquier detalle que consideres 'de impacto' para alguna propuesta de solucion ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 Marvin
29/07/2005 - 20:06 | Informe spam
Parecia simple, pero veo que por tu analisis no lo es tanto...

En una tabla PRIMERA llamemosla así, tengo aprox. 50,000 registros, con 7
campos, uno de ellos se llama PAQUETE, cada registro tiene un paquete que
puede repetirse N veces, más de 50, en otra tabla SEGUNDA tengo una lista con
los 30 paquetes de mayor ingreso, quiero que se filtre la tabla PRIMERA con
el primer registro de la tabla SEGUNDA, de ahí sólo quiero seleccionar al
azar 20 registros, copiarlos y pegarlos en una nueva tabla TERCERA, y así
sucesivamente hasta terminar con los 30 paquetes, e irlos copiando en la
tabla TERCERA consecutivamente.

Espero me puedas apoyar, ya que esto lo tengo que hacer constantemente y me
ayudaría muchísimo. Gracias



"Héctor Miguel" escribió:

hola, Marvin !

> ... una tabla con 30 registros... de los cuales quiero buscar cada uno en otra tabla
> ... filtrarla por ese registro
> ... ya... filtrada... que en otra columna... del total de los registros filtrados marque... 20 registros al azar

[hasta donde se]... para que una seleccion 'aleatoria'... resute ser... 'verdaderamente aleatoria'...
necesitas un algoritmo/codigo que 'salte elementos aleatoriamente' y... 'marque -tambien- aleatoriamente'
necesitaras tambien 'cuidar' de que no se ejecute si el numero de elementos 'seleccionables' es inferior a la 'marca'
-> para filtrar 30 veces 20... podria 'asumirse' que el listado 'grande' tiene al menos 20 de cada uno [>= ~700] ?
una cuestion que [seguramente] haria que la ejecucion del codigo sea 'leeennnta'...
-> es SI deseas que la tabla 'filtrable' se siga conservando como una sola entidad/tabla/hoja/... -?-
[a menos que resultara 'aceptable' que el registro_filtrado_UNO se pase a la Hoja_UNO -y asi sucesivamente-] -?-
tambien seria de utilidad si comentas...
-> cuantas columnas [o campos] hay en las tablas ? [y los rangos/hojas donde se ubican]
[a menos que quieras que el codigo 'las detecte' -si fuera el caso de que son 'variables'-] -?-
-> cual columna/campo es el que se filtra ?

comentas cualquier detalle que consideres 'de impacto' para alguna propuesta de solucion ?
saludos,
hector.



Respuesta Responder a este mensaje
#3 Héctor Miguel
30/07/2005 - 05:29 | Informe spam
hola, Marvin !

... una tabla PRIMERA llamemosla asi, tengo aprox. 50,000 registros, con 7 campos, uno de ellos se llama PAQUETE
... cada registro tiene un paquete que puede repetirse N veces, mas de 50
... otra tabla SEGUNDA tengo una lista con los 30 paquetes de mayor ingreso
... que se filtre la tabla PRIMERA con ... registro de la tabla SEGUNDA
... de ahi solo quiero seleccionar al azar 20 registros, copiarlos y pegarlos en una nueva tabla TERCERA
... sucesivamente hasta terminar con los 30 paquetes [...]



espero que te parezca [al menos... 'casi'] 'verdaderamente aleatoria' la siguiente propuesta: :))
si cualquier duda... ¿comentas?
saludos,
hector.

1) estoy 'teniendo que' suponer los siguientes datos [modifica donde corresponda]...
-> el listado 'completo' en la hoja 'Datos' y en el rango 'A1:G451' [7 columnas -> y se incluyen los titulos <-]
-> la lista de los 'x_a_filtrar' en la hoja 'Lista' en el rango 'A2:A4'
-> en ambos listados, la columna que contiene los 'paquetes' es la columna 'A'
2) lo que 'hace' el codigo es seleccionar AL AZAR una de 4 opciones para 'poner' unos o ceros en un rango 'adyacente' [col 'H']
las cuatro [posibles] opciones, son para 'recorrer' el listado un orden aleatorio, y son:
a) de arriba hacia abajo 'saltando aleatoriamente' un numero de filas
b) de abajo hacia arriba 'saltando aleatoriamente' un numero de filas
c) de la mitad del listado hacia arriba y luego hacia abajo 'saltando aleatoriamente' un numero de filas
d) de la mitad del listado hacia abajo y luego hacia arriba 'saltando aleatoriamente' un numero de filas
3) filtra el listado 'completo' [solo los unos] y copia en una hoja nueva los 20 [o 'n'] elementos 'seleccionados' [al azar]
4) lo que si te puedo 'asegurar'... es que 'pocas veces' obtendras un mismo listado 'azaroso' :D
5) se puede 'automatizar' mas el proceso [agregar variables e instrucciones offset y resize, etc.] pero para 'adivinar'... -?-
[por lo pronto... 'tendras que' modificar 'a pie' mis supuestos por la 'realidad'] :(
en un modulo de codigo 'normal' ==Sub Prepara_Selecciones()
Dim Paquete As Range, F1 As Long, Fx As Long
Application.ScreenUpdating = False
Worksheets("Datos").Range("a1:g451").Sort _
Key1:=Worksheets("Datos").Range("a1"), _
Order1:=xlAscending, Header:=xlYes
For Each Paquete In Worksheets("Lista").Range("a2:a4")
With Worksheets("Datos"): .Activate: .Columns("h").ClearContents
F1 = Evaluate("min(if(a1:a65535=""" & Paquete & """,row(a1:a65535)))")
Fx = Evaluate("max(row(a1:a65535)*(a1:a65535=""" & Paquete & """))")
Selecciona .Range("h" & F1 & ":h" & Fx)
With .Columns("h"): If .AutoFilter Then .AutoFilter
.AutoFilter Field:=1, Criteria1:="=1"
End With
.Range("a1:g451").SpecialCells(xlCellTypeVisible).Copy _
Worksheets.Add.Range("a1")
ActiveSheet.Name = Paquete: Columns.EntireColumn.AutoFit
With .Columns("h"): .AutoFilter: .ClearContents: End With
End With
Next
End Sub
Sub Selecciona(ByVal Seccion As Range, Optional ByVal Objetivo As Byte = 20)
Dim Forma As Integer, Sig As Long: Forma = Int(4 * Rnd)
With Seccion
Do
If Forma = 1 Then
For Sig = .Rows.Count To 1 Step -((7 * Rnd) + 1)
If .Cells(Sig) = 0 Then .Cells(Sig) = Int(2 * Rnd)
If Application.Sum(Seccion) = Objetivo Then Exit Sub
Next
ElseIf Forma = 2 Then
For Sig = .Rows.Count / 2 To 1 Step -((7 * Rnd) + 1)
If .Cells(Sig) = 0 Then .Cells(Sig) = Int(2 * Rnd)
If Application.Sum(Seccion) = Objetivo Then Exit Sub
Next
For Sig = .Rows.Count / 2 To .Rows.Count Step ((7 * Rnd) + 1)
If .Cells(Sig) = 0 Then .Cells(Sig) = Int(2 * Rnd)
If Application.Sum(Seccion) = Objetivo Then Exit Sub
Next
ElseIf Forma = 3 Then
For Sig = .Rows.Count / 2 To .Rows.Count Step ((7 * Rnd) + 1)
If .Cells(Sig) = 0 Then .Cells(Sig) = Int(2 * Rnd)
If Application.Sum(Seccion) = Objetivo Then Exit Sub
Next
For Sig = .Rows.Count / 2 To 1 Step -((7 * Rnd) + 1)
If .Cells(Sig) = 0 Then .Cells(Sig) = Int(2 * Rnd)
If Application.Sum(Seccion) = Objetivo Then Exit Sub
Next
Else
For Sig = 1 To .Rows.Count Step ((7 * Rnd) + 1)
If .Cells(Sig) = 0 Then .Cells(Sig) = Int(2 * Rnd)
If Application.Sum(Seccion) = Objetivo Then Exit Sub
Next
End If
Loop
End With
End Sub
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida