PocketMagic

PocketMagic

Onde Tecnologia encontra magia

PocketMagic RSS Alimentos
 

Gerador de números Pseudocasual linear (PRNG)

Por Radu Motisan Posto no correio no dia 17 de janeiro de 2010

Intro

Muito muitas vezes temos de gerar números aleatórios com objetivos diferentes nos limites de jogos simples a algoritmos de encriptação de avanços.
Muitos C/C ++ os programadores são bem usados com o srand () / rand () as funções, mas simplesmente a utilização de um código predestinado para realizar as tarefas dadas, são às vezes não bastante.
Totalmente entender qual um número aleatório é, como pode ser gerado, ajuda a obtenção da melhor solução.

Começando com os meus primeiros anos universitários, usei um gerador pseudocasual linear, fácil implementar, e bastante útil em muitas aplicações.
Um pseudogerador de números aleatórios (PRNG) é um algoritmo para gerar uma seqüência de números que aproxima sobre as propriedades de números aleatórios. A seqüência não é realmente casual nisto é completamente determinada por um jogo relativamente pequeno de valores iniciais, chamados o estado do PRNG. Leia mais aqui. Read more here.

Uma aproximação simples

Vai considerar a, b e c três número inteiro constante. Planejamos gerar o grupo de pseudonúmeros aleatórios X0, X1..., Xn. Assumindo X0 = d, o resto dos números pode ser computado em uma utilização periódica da fórmula: Assuming X0 = d, the rest of the numbers can be computed in a recurrent using the formula:
Xn+1 = (a*Xn + b) % c.

a, b, c e d são os valores iniciais, também conhecidos como o estado do PRNG.

o c limita os valores resultantes ao intervalo 0.. c-1
a e b estão afetando o ângulo linear.

Aqui está um algoritmo C simples para ilustrar melhor a fórmula:

#include

o principal interno ()
{
número interno a=71, b=19, c=256, d = 3;

número interno x [200], eu = 0;
x [0] = d;
para (i=1; eu<200;i++)
x [eu] = (a*x [i-1] + b) % c;

printf ("Os números aleatórios pseudo are:\n");
para (i=0; eu<200;i++)
printf (" %d", x [eu]);

volte 1;
}

Você pode ver o resultado na seguinte imagem:
pnrg1
Texto fonte here:pnrg1.

Parecer-se com o srand () e rand () funciona você está tudo acostumado a, tenho de destacar isto eles também estão usando um PRNG. srand () "semeia" o gerador casual e praticamente tudo que faz deve estabelecer os valores iniciais (o estado de PRNG).
Você pode adaptar facilmente o gerador em cima para trabalhar como srand () e rand ():

#include

número interno um = 71, b = 19, d = 0;

vazio mysrand (semente interna)
{
d = semente;
}

número interno myrand (limiar interno)
{
número interno x = d;
x = (a*x + b) limiar de %;
d = x;//avançam com cada chamada da função
devolva x;
}

o principal nulo ()
{
mysrand (122);
printf ("Pseudonúmero aleatório: %d\n", myrand (256));
printf ("Pseudonúmero aleatório: %d\n", myrand (256));

}

Resultado como pintado abaixo:
pnrg2
O texto fonte aqui: pnrg2

Você notará rapidamente que o PRNG produz a mesma cada vez de produção você inicializa o mysrand com o mesmo valor:
mysrand (122)-> myrand (256) =233
Mas isto é o mesmo em caso do construído em srand () e rand () função também. A razão consiste em que não temos uma boa fonte do caos. Você pode superar isto usando: You can overcome this by using:
mysrand (GetTickCount);
ou
mysrand (Cursorpos.x)
ou
mysrand (FreeRAMMemory)
ou
mysrand (UserLastKeyPressed)
ou etc., ligando a função de inicialização a um evento casual.

Nova análise

Falando sobre o nível de caos deste gerador, há um modo simples de analisar uma seqüência de números, no nosso caso o X0..., Xn serie outputed pelo PRNG linear.
1. Em um espaço traçado medidas único, representado pelo eixo de número real e o jogo correspondente de todos os números reais (R), um número dado pode ser examinado como uma entidade única que corresponde a um ponto no eixo.
Para eg., ver o seguinte quadro:
pnrg3
Ele representa alguns números reais no eixo. Cada um poderia perguntar, o que é a significação do número-1.13. A resposta simples é:-1.13 é a entidade que se senta no eixo na posição dada. Várias propriedades podem ser extrapoladas, e adquirimos uma significação do que-1.13 é, e mais importante: o que pode nós fazer com ele. The simple answer is: -1.13 is the entity that sits on the axis at the given position. Several properties can be extrapolated, and we get a meaning of what -1.13 is, and most important: what can we do with it.
2. Para um par dado de números, podemos a imagem um espaço bidimensional, onde o par representa um ponto em um sistema Cartesiano da referência. O par recebe uma significação, e podemos entrar em detalhes além disso nisto, usando o par com vários objetivos.

De um modo semelhante, para um jogo dado de números (x0, x1..., xn) que parecem casuais e sem sentido no início, vão não se esquecem de que em um espaço n-dimensional, o jogo de números tem uma significação muito simples e clara: ele representa um ponto.

Afortunadamente, para o PRNG's as coisas são mais simples.
O grupo dado de números gerou com o PRNG linear, eles podem ser representados sem qualquer significação em uma dimensão: eles seriam pontos "casuais" no eixo de número.
MAS, podemos procurar um "caminho" ou uma "significação" movendo-nos para um espaço superior, neste caso a duas dimensões, e representando os números pseudo determinados pelo ponto de coordenadas (Xn-1, Xn).

Ver a seguinte amostra:
1-a primeira amostra PRNG pus no correio, produzi os seguintes números:
3 83 24 72 11 32243120 91 80 67168.... etc.
É muito difícil entender o que estes números significam ou dar um objetivo a esta seqüência ou até entender o modelo que serviu para produzi-los.

2-Vão escrever que a um programa simples ilustre graficamente em dois pares de dimensões de números (Xn, Xn+1) como pontos em um sistema Cartesiano.
Gerador de números aleatórios Pseudo linear
Os pontos no quadro não são nada mais então 200 números aleatórios pseudo (3 83 24 72 11 32243120 91 80 67168
171 8 75224 51 56155 16 6
4211152 59112 545700355 40 43 0 19
88123 48 99136203 96179184 27144 3 83 24187
240163 72 11 32243120 91 80 67
227 8 75224 51 56155 16 64211152 59112 35200
814135811 40 43 0 19 88123 48 99136203 9
6179184 27144 3 83 24 72 11 32243
120 91 80 67 8 75224 51 56155
16 64211152 59112 35 200 139 20
8195 40 43 0 19 88123 48 99136203 96179184 27144 3232
107192 83 24187240)

De maneira interessante, o que em primeiro pareceu o caos total, agora lembra a ordem própria de um pomar com árvores propriamente plantadas em linhas e colunas, em um ângulo dado, na nossa imagem representada pelos pontos pretos.
Adquira o texto fonte aqui: pnrg3gui

Se examinar a seqüência em duas dimensões não mostrar nada útil, podemos mover-nos além disso e verificar a representação em três dimensões, pontos de coordenadas (Xn-1, Xn, Xn+1), e assim por diante.

Como mostrado em cima, a um nível dado, o conteúdo "casual" adquirirá uma significação.

Espere que isto ajude,
Radu

Por Radu Motisan

Deixe uma Resposta

Por favor copie a cadeia gIPHj9 ao campo abaixo:

Opções de Blog

Tradutor

English flagFrench flagGerman flagItalian flagPortuguese flagRussian flagSpanish flag
By N2H

Categorias

Arquivos

Etiquetas

Links patrocinados

Assine!

Adquira mais seguidores

Os nossos Patrocinadores