Enorme lista ordenada de números aleatorios

Necesito crear un método que devuelva un número muestreado de alguna distribución aleatoria donde cada vez que llame al método, el número devuelto sea más grande que cualquier número devuelto anteriormente.

O, en otras palabras, necesito un iterador para una lista ordenada de valores aleatorios.

Lamentablemente, la lista es demasiado grande para ser creada en la memoria como un todo. La primera idea que se me ocurrió es dividir mi espacio de valores en depósitos, donde cada depósito contiene valores en algún rango [a, b). Digamos que mi lista tiene N elementos. Para crear un depósito, probaría mi distribución N veces y colocaría cada valor en el rango [a, b) en el depósito. Los valores fuera de ese cubo serían descartados.

De esta forma, podría crear un nuevo depósito cada vez que repitiera el último y mantener bajo el consumo de memoria.

Sin embargo, como no soy un experto en estadísticas, tengo un poco de miedo de que esto de alguna manera arruine los números que obtengo. ¿Es este un enfoque apropiado? ¿Es importante utilizar el mismo generador de distribución exacto (una instancia de org.apache.commons.math3.distribution.RealDistribution) para cada depósito?

Actualización: Parece que hice un mal trabajo al explicar de qué tipo de número aleatorio estoy hablando.

Mis números forman una muestra de una distribución aleatoria como, por ejemplo, una distribución normal con una media de my una varianza de v, o una distribución uniforme o distribución exponencial.

Utilizo esos números para modelar algún comportamiento en una simulación. Digamos que quiero desencadenar eventos en algunos momentos. Necesito programar miles de millones de eventos y las veces que se activan esos eventos deben formar una muestra de una distribución aleatoria.

Entonces, si obtengo mi próximo número agregando un número aleatorio a mi número anterior, de hecho, obtengo una secuencia de números aleatorios crecientes, pero los números no formarán una muestra de mi distribución.

Respuesta 1

En usted puede decir cuáles son los requisitos de su generador aleatorio.

Necesito crear un método que devuelva un número muestreado de alguna distribución aleatoria donde cada vez que llame al método, el número devuelto sea más grande que cualquier número devuelto anteriormente.

Puedes hacer algo como

private long previous = 0;
private final Random rand = new Random();

public long nextNumber() {
  return previous += rand.nextInt(10) + 1;
}

Los detalles dependen de cómo desee modelar sus números aleatorios.

Respuesta: 2

Si la lista es demasiado grande para almacenarla en la memoria, puede usar una base de datos y leer / escribir lotes de elementos de la lista desde y hacia la base de datos.

De esta manera, solo necesita almacenar un lote en la memoria a la vez.

Respuesta: 3

Comenzaría creando una variable y almacenando su primer número aleatorio, luego generaría otro número aleatorio, compárelos y, si es más grande, guárdelo tanto en el almacenamiento grande como en el ram, repita como el siguiente número aleatorio se compararía con un valor único en memoria.

Respuesta: 4

Puede agregar un número aleatorio al número generado anteriormente. Por lo tanto, debe mantener en la memoria solo el número que generó en el paso de iteración anterior.

Respuesta: 5

Me doy cuenta de que hay otra pregunta relacionada con los "infinitos" JScrollPanes, sin embargo, creo que lo que estoy buscando es algo que es sutilmente diferente. Básicamente, tengo una colección de objetos ...

¿Por qué no se pueden sincronizar los métodos de interfaz estáticos y predeterminados? La gente dice que sincronizado es un detalle de implementación. Bueno, strictlyfp es un detalle de implementación también, pero eso no ...

Estoy buscando una manera de convertir un archivo HTML a PDF usando una biblioteca Java que es preferiblemente gratuita. He hecho algunas búsquedas en línea para buscar herramientas para usar, pero no he encontrado una solución que se mantenga ...

Cuando se usan comodines, algunos métodos (por ejemplo, ArrayList.set) no se pueden usar y devuelven un mensaje de error similar al conjunto de métodos (int, capture # 3-of?) En el tipo List no es aplicable para ...