Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Generar números cuasi aleatorios

Secuencias cuasi-aleatorias

(QRNGs) producen muestras altamente uniformes del hipercubo de la unidad.Los generadores de números cuasi aleatorios Los QRNGs minimizan el entre la distribución de los puntos generados y una distribución con proporciones iguales de puntos en cada subcubo de una partición uniforme del hipercubo.Discrepancia Como resultado, QRNGs rellena sistemáticamente los "agujeros" en cualquier segmento inicial de la secuencia cuasi-aleatoria generada.

A diferencia de las secuencias pseudoaleatorias descritas en, las secuencias cuasialeatorios fallan muchas pruebas estadísticas de aleatoriedad.Métodos de generación de números Pseudorandom comunes Sin embargo, aproximar la verdadera aleatoriedad no es su objetivo. Las secuencias cuasi-aleatorias buscan llenar el espacio uniformemente, y hacerlo de tal manera que los segmentos iniciales aproximen este comportamiento hasta una densidad especificada.

Las aplicaciones QRNG incluyen:

  • Las técnicas de Monte Carlo se utilizan a menudo para evaluar integrales difíciles y multidimensionales sin una solución de forma cerrada.Quasi-Monte Carlo (QMC) integration. QMC utiliza secuencias cuasi-aleatorias para mejorar las propiedades de convergencia de estas técnicas.

  • En muchos entornos experimentales, tomar medidas en cada ajuste de los factores es costoso o inviable.Space-filling experimental designs. Las secuencias cuasi-aleatorias proporcionan muestreo eficiente y uniforme del espacio de diseño.

  • Los algoritmos de optimización suelen encontrar un óptimo local en la vecindad de un valor inicial.Global optimization. Mediante el uso de una secuencia casi aleatoria de valores iniciales, las búsquedas de optima global muestrean uniformemente las cuencas de atracción de todos los mínimos locales.

Ejemplo: uso de Scramble, Leap y SKIP

Imagine una secuencia 1-D simple que produzca los enteros de 1 a 10. Esta es la secuencia básica y los tres primeros puntos son:[1,2,3]

Ahora mira cómo, y trabaja en conjunto:ScrambleSkipLeap

  • — La aleatorización baraja los puntos de una de varias maneras diferentes.Scramble En este ejemplo, supongamos que un scramble convierte la secuencia en.1,3,5,7,9,2,4,6,8,10 Los tres primeros puntos son ahora:[1,3,5]

  • : Un valor especifica el número de puntos iniciales que se omiten.SkipSkip En este ejemplo, establezca el valor en 2.Skip La secuencia es ahora y los tres primeros puntos son:5,7,9,2,4,6,8,10[5,7,9]

  • : Un valor especifica el número de puntos que se omiten para cada uno de los que se toman.LeapLeap Continuando el ejemplo con el conjunto a 2, si usted fija el a 1, la secuencia utiliza cada otro punto.SkipLeap En este ejemplo, la secuencia es ahora y los tres primeros puntos son:5,9,4,8[5,9,4]

Conjuntos de puntos cuasi-aleatorios

funciones soportan estas secuencias cuasi-aleatorias:Statistics and Machine Learning Toolbox™

  • Producido por la función.Halton sequences.haltonset Estas secuencias utilizan diferentes bases principales para formar particiones uniformes sucesivamente más finas del intervalo de unidades en cada dimensión.

  • Producido por la función.Sobol sequences.sobolset Estas secuencias utilizan una base de 2 para formar particiones uniformes sucesivamente más finas del intervalo de unidades y, a continuación, reordenar las coordenadas en cada dimensión.

  • Producido por la función.Latin hypercube sequences.lhsdesign Aunque no casi al azar en el sentido de minimizar la discrepancia, estas secuencias producen, sin embargo, muestras uniformes dispersas útiles en diseños experimentales.

Las secuencias cuasi-aleatorias son funciones de los enteros positivos al hypercube de la unidad. Para ser útil en la aplicación, una inicial de una secuencia debe generarse.conjunto de puntos Los conjuntos de puntos son matrices de tamaño por-, donde es el número de puntas y es la dimensión del hipercubo que se está muestreando.ndnd Las funciones y el punto de construcción se establece con las propiedades de una secuencia cuasi-aleatoria especificada.haltonsetsobolset Los segmentos iniciales de los conjuntos de puntos se generan por el método de las clases y, pero los puntos se pueden generar y acceder más generalmente mediante la indexación de paréntesis.nethaltonsetsobolset

Debido a la forma en que se generan las secuencias cuasi-aleatorias, pueden contener correlaciones indeseables, especialmente en sus segmentos iniciales, y especialmente en dimensiones superiores. Para solucionar este problema, los conjuntos de puntos casi aleatorios suelen ,Saltar , oSalto valores de una secuencia.Lucha Las funciones y permiten especificar tanto a como una propiedad de una secuencia casi aleatoria, y el método de las clases y permite aplicar una variedad de técnicas de aleatorización.haltonsetsobolsetSkipLeapLuchahaltonsetsobolset La aleatorización reduce las correlaciones y también mejora la uniformidad.

Genere un conjunto de puntos cuasi-aleatorios

Este ejemplo muestra cómo utilizar para construir un conjunto de puntos quasi-aleatorios 2-D Halton.haltonset

Cree un objeto que omita los primeros 1000 valores de la secuencia y, a continuación, conserve cada punto 101.haltonsetp

rng default  % For reproducibility p = haltonset(2,'Skip',1e3,'Leap',1e2)
p =  Halton point set in 2 dimensions (89180190640991 points)  Properties:               Skip : 1000               Leap : 100     ScrambleMethod : none  

El objeto encapsula las propiedades de la secuencia cuasi-aleatoria especificada.p El conjunto de puntos es finito, con una longitud determinada por las propiedades y por los límites del tamaño de los índices del conjunto de puntos.SkipLeap

Se utiliza para aplicar la aleatorización de Radix inversa.Lucha

p = scramble(p,'RR2')
p =  Halton point set in 2 dimensions (89180190640991 points)  Properties:               Skip : 1000               Leap : 100     ScrambleMethod : RR2  

Se usa para generar los primeros 500 puntos.net

X0 = net(p,500);

Esto equivale a

X0 = p(1:500,:);

Los valores del conjunto de puntos no se generan y se almacenan en la memoria hasta que se accede a través de indexación o entre paréntesis.X0pnet

Para apreciar la naturaleza de los números casi aleatorios, cree un gráfico de dispersión de las dos dimensiones.X0

scatter(X0(:,1),X0(:,2),5,'r') axis square title('{\bf Quasi-Random Scatter}')

Compare esto con una dispersión de números pseudoaleatorios uniformes generados por la función.rand

X = rand(500,2); scatter(X(:,1),X(:,2),5,'b') axis square title('{\bf Uniform Random Scatter}')

La dispersión cuasi-aleatoria parece más uniforme, evitando la aglomeración en el Scatter pseudoaleatorio.

En un sentido estadístico, los números casi aleatorios son demasiado uniformes para pasar las pruebas tradicionales de aleatoriedad. Por ejemplo, una prueba de Kolmogorov-Smirnov, realizada por, se utiliza para evaluar si un conjunto de puntos tiene una distribución aleatoria uniforme.kstest Cuando se realiza repetidamente en muestras de seudoaleatoria uniformes, como las generadas por, la prueba produce una distribución uniforme de valores.randp

nTests = 1e5; sampSize = 50; PVALS = zeros(nTests,1); for test = 1:nTests     x = rand(sampSize,1);     [h,pval] = kstest(x,[x,x]);     PVALS(test) = pval; end  histogram(PVALS,100) h = findobj(gca,'Type','patch'); xlabel('{\it p}-values') ylabel('Number of Tests')

Los resultados son muy diferentes cuando la prueba se realiza repetidamente en muestras uniformes cuasi-aleatorias.

p = haltonset(1,'Skip',1e3,'Leap',1e2); p = scramble(p,'RR2');  nTests = 1e5; sampSize = 50; PVALS = zeros(nTests,1); for test = 1:nTests     x = p(test:test+(sampSize-1),:);     [h,pval] = kstest(x,[x,x]);     PVALS(test) = pval; end  histogram(PVALS,100) xlabel('{\it p}-values') ylabel('Number of Tests')

Los valores pequeños cuestionan la hipótesis nula de que los datos se distribuyen uniformemente.p Si la hipótesis es verdadera, se espera que alrededor del 5% de los-valores caigan por debajo de 0,05.p Los resultados son notablemente consistentes en su fracaso para desafiar la hipótesis.

Las transmisiones cuasi-aleatorias

Cuasi-aleatoria, producida por la función, se utilizan para generar salidas cuasi-aleatorias secuenciales, en lugar de conjuntos de puntos de un tamaño específico.Arroyosqrandstream Las secuencias se utilizan como pseudoRNGS, como, cuando las aplicaciones cliente requieren una fuente de números casi aleatorios de tamaño indefinido que se puede acceder de forma intermitente.rand Las propiedades de una secuencia casi aleatoria, como su tipo (Halton o Sobol), dimensión, omitir, salto y Scramble, se establecen cuando se construye la secuencia.

En la implementación, las secuencias cuasi-aleatorias son esencialmente conjuntos de puntos casi aleatorios muy grandes, aunque se accede a ellos de manera diferente. el de una secuencia casi aleatoria es el índice escalar del siguiente punto que se va a tomar de la secuencia.Estado Utilice el método de laqrand qrandstream clase para generar puntos de la secuencia, comenzando desde el estado actual. Utilice el método para restablecer el estado a.reset1 A diferencia de los conjuntos de puntos, las secuencias no admiten la indexación de paréntesis.

Genere una secuencia cuasi-aleatoria

En este ejemplo se muestra cómo generar muestras a partir de un conjunto de puntos cuasi aleatorios.

Utilíce para crear un conjunto de puntos casi aleatorios y, a continuación, incremente repetidamente el índice en el conjunto de puntos para generar diferentes muestras.haltonsetptest

p = haltonset(1,'Skip',1e3,'Leap',1e2); p = scramble(p,'RR2');  nTests = 1e5; sampSize = 50; PVALS = zeros(nTests,1); for test = 1:nTests     x = p(test:test+(sampSize-1),:);     [h,pval] = kstest(x,[x,x]);     PVALS(test) = pval; end

Los mismos resultados se obtienen mediante la construcción de una secuencia casi aleatoria basada en el conjunto de puntos y permitir que la secuencia se encarga de los incrementos en el índice.qrandstreamqp

p = haltonset(1,'Skip',1e3,'Leap',1e2); p = scramble(p,'RR2'); q = qrandstream(p);  nTests = 1e5; sampSize = 50; PVALS = zeros(nTests,1); for test = 1:nTests     X = qrand(q,sampSize);     [h,pval] = kstest(X,[X,X]);     PVALS(test) = pval; end

Temas relacionados