NetLogo: ¿Cómo puedo construir un nuevo vector basado en valores elegidos al azar de otro vector?
Tengo un vector ‘original’ con 10 dígitos. Ahora quiero crear un vector ‘adaptado’ basado en ‘original’. Se supone que ‘adaptado’ debe tomar n valores aleatorios que sean mayores que 0 de ‘original’ en la misma posición y llenar el resto con ceros, por ejemplo:
original = [2 3 6 2 0 5 7 2 4 8]
adaptado = [2 0 0 0 0 5 0 2 0 0]
para hacerlo
dejar n 3
dejar dimension-vector 10
dejar original []
repetir dimension-vector
[establecer original lput random 10 original]
imprimir original
dejar adaptado []
mientras [sumar (mapa [ [v1] -> si-valor-entonces (v1 > 0) [1] [0] ] (adaptado)) != n]
[establecer adaptado (mapa [ [v1] -> si-valor-entonces ( (dimension-vector / n) * (100 / dimension-vector) > random-float 100) [v1] [0] ] (original)) ]
imprimir adaptado
fin
Este código funciona pero es lento. ¿Cómo puedo hacerlo más rápido?
davy.ai
Hay algunas formas de potencialmente hacer que este código sea más rápido:
Puede utilizar el primitivo
filter
para generar una lista de índices donde el vector original tiene valores distintos de cero, y luego seleccionar aleatoriamente n índices de esa lista para utilizar como posiciones de los valores distintos de cero en el vector adaptado. Esto evita la necesidad de generar el vector adaptado elemento por elemento, lo cual puede ser lento para vectores grandes.Aquí hay un ejemplo de implementación de estas optimizaciones:
En esta implementación, generamos una lista de índices distintos de cero utilizando el primitivo
filter
con una función lambda que verifica si el elemento es mayor que 0. Luego, utilizamos el primitivon-values
para generar una lista de ceros y seleccionamos aleatoriamente n índices para reemplazarlos con valores distintos de cero. Hacemos esto verificando si el índice actual es múltiplo devector-dimension / n
y todavía hay menos de n valores distintos de cero. Si esta condición es verdadera, seleccionamos un índice aleatorio de la lista de índices distintos de cero utilizandolist:random-member
. De lo contrario, utilizamos 0 como valor para ese índice.Nota que esta implementación asume que
vector-dimension
es divisible porn
. Si este no es el caso, es posible que necesite ajustar la lógica para seleccionar los índices distintos de cero para asegurarse de que seleccione exactamente n valores distintos de cero.