As soluções anteriores não são ótimas. A complexidade é exatamente nas chamadas para RandNum50 e é descrita em alguns detalhes aqui , usando como fonte de bit aleatório (como sugerido por Vor):nlogn+O(1)
if ( rand50() > 25 ) then b = 1 else b = 0 // random bit
A idéia básica é que você salve muitos bits se gerar um uniforme entre e, E, em seguida, utilizando a decomposição de base fatorial , em vez de gerar uma sequência de uniformes variou-se a , em seguida, , então , etc., . Este é realmente, como mencionei no post, o tópico de um artigo que enviei!n ! 1 2 3 n1n!123n
Se você não souber como gerar um uniforme, como sugerido nesse post, a partir de um bit aleatório, também poderá gerar uma aproximação do uniforme diretamente, desta maneira (o que é equivalente ao "trulyrand" de Vor, mas mais rápido):
P = (RandNum50()-1) + (RandNum50()-1)*50^1 + (RandNum50()-1)*50^2 + ...
indo o mais longe que você precisa. Isso está desenvolvendo na base . Em seguida, basta truncar , ou seja, , no seu caso. Esse valor não é completamente aleatório, mas é uma medida de uniformidade que é frequentemente usada. Ou, como Vor sugere, você pode rejeitar se . Então, com esse valor, você pode fazer a expansão da base fatorial, conforme descrito na publicação .50 PP50Pn = 100 ! P > nQ=Pmodnn=100!P>n