Você deve usar a arc4random_uniform()
função Ele usa um algoritmo superior para rand
. Você nem precisa colocar uma semente.
#include <stdlib.h>
// ...
// ...
int r = arc4random_uniform(74);
A arc4random
página do manual:
NAME
arc4random, arc4random_stir, arc4random_addrandom -- arc4 random number generator
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <stdlib.h>
u_int32_t
arc4random(void);
void
arc4random_stir(void);
void
arc4random_addrandom(unsigned char *dat, int datlen);
DESCRIPTION
The arc4random() function uses the key stream generator employed by the arc4 cipher, which uses 8*8 8
bit S-Boxes. The S-Boxes can be in about (2**1700) states. The arc4random() function returns pseudo-
random numbers in the range of 0 to (2**32)-1, and therefore has twice the range of rand(3) and
random(3).
The arc4random_stir() function reads data from /dev/urandom and uses it to permute the S-Boxes via
arc4random_addrandom().
There is no need to call arc4random_stir() before using arc4random(), since arc4random() automatically
initializes itself.
EXAMPLES
The following produces a drop-in replacement for the traditional rand() and random() functions using
arc4random():
#define foo4random() (arc4random() % ((unsigned)RAND_MAX + 1))
arc4random_uniform(x)
como descrito abaixo por @yood. Também está em stdlib.h (depois do OS X 10.7 e iOS 4.3) e fornece uma distribuição mais uniforme dos números aleatórios. Usoint r = arc4random_uniform(74);
Use a
arc4random_uniform(upper_bound)
função para gerar um número aleatório dentro de um intervalo. A seguir, será gerado um número entre 0 e 73, inclusive.arc4random_uniform(upper_bound)
evita viés de módulo, conforme descrito na página de manual:fonte
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_3
Se a verificação falhar, volte para outra solução.O mesmo que C, você faria
(supondo que você quis dizer incluindo 0, mas excluindo 74, que é o que seu exemplo de Java faz)
Edit: Sinta-se livre para substituir
random()
ouarc4random()
pararand()
(o que é, como outros apontaram, muito sucky).fonte
Eu pensei que poderia adicionar um método que eu uso em muitos projetos.
Se eu acabar usando em muitos arquivos, normalmente declaro uma macro como
Por exemplo
Nota: Apenas para iOS 4.3 / OS X v10.7 (Lion) e posterior
fonte
Isso fornecerá um número de ponto flutuante entre 0 e 47
Ou simplesmente
Os limites inferior e superior também podem ser negativos . O código de exemplo abaixo fornece um número aleatório entre -35,76 e +12,09
Converta o resultado em um valor inteiro mais redondo :
fonte
drand48
vez disso para pontos flutuantes.De acordo com a página de manual para rand (3), a família de funções rand foi obsoleta por acaso (3). Isso se deve ao fato de os 12 bits inferiores de rand () passarem por um padrão cíclico. Para obter um número aleatório, basta propagar o gerador chamando srandom () com uma semente não assinada e, em seguida, chame random (). Portanto, o equivalente ao código acima seria
Você só precisará chamar srandom () uma vez no seu programa, a menos que queira alterar sua semente. Embora você tenha dito que não queria uma discussão sobre valores verdadeiramente aleatórios, rand () é um gerador de números aleatórios bastante ruim, e random () ainda sofre com o viés do módulo, pois gera um número entre 0 e RAND_MAX. Portanto, por exemplo, se RAND_MAX é 3 e você deseja um número aleatório entre 0 e 2, é duas vezes mais provável que você obtenha um 0 que um 1 ou um 2.
fonte
Melhor usar
arc4random_uniform
. No entanto, isso não está disponível abaixo do iOS 4.3. Felizmente, o iOS vincula esse símbolo no tempo de execução, não no tempo de compilação (portanto, não use a diretiva #if pré-processador para verificar se está disponível).A melhor maneira de determinar se
arc4random_uniform
está disponível é fazer algo assim:fonte
Eu escrevi minha própria classe de utilitário de número aleatório apenas para ter algo que funcionasse um pouco mais como Math.random () em Java. Ele tem apenas duas funções, e tudo é feito em C.
Arquivo de cabeçalho:
Arquivo de implementação:
É uma maneira bastante clássica de gerar pseudo-randoms. No delegado do meu aplicativo, eu chamo:
Depois, apenas digo:
Observe que esse método retorna um número aleatório entre 0,0f (inclusive) e 1,0f (exclusivo).
fonte
Já existem respostas ótimas e articuladas, mas a pergunta pede um número aleatório entre 0 e 74. Use:
arc4random_uniform(75)
fonte
No iOS 9 e OS X 10.11, você pode usar as novas classes GameplayKit para gerar números aleatórios de várias maneiras.
Você tem quatro tipos de fonte para escolher: uma fonte aleatória geral (sem nome, até o sistema escolher o que faz), congruencial linear, ARC4 e Mersenne Twister. Isso pode gerar entradas, flutuadores e bools aleatórios.
No nível mais simples, você pode gerar um número aleatório a partir da fonte aleatória interna do sistema, como esta:
Isso gera um número entre -2.147.483.648 e 2.147.483.647. Se você deseja um número entre 0 e um limite superior (exclusivo), use este:
O GameplayKit possui alguns construtores de conveniência incorporados para trabalhar com dados. Por exemplo, você pode rolar um dado de seis lados assim:
Além disso, você pode moldar a distribuição aleatória usando coisas como
GKShuffledDistribution
.fonte
Gere um número aleatório entre 0 e 99:
Gere um número aleatório entre 500 e 1000:
fonte
// O exemplo a seguir vai gerar um número entre 0 e 73.
Resultado:
número aleatório: 72
número aleatório passo 2: 52
fonte
Para desenvolvedores de jogos, use random () para gerar randoms. Provavelmente pelo menos 5x mais rápido do que usar arc4random (). O viés do módulo não é um problema, especialmente para jogos, ao gerar randoms usando toda a gama aleatória (). Certifique-se de semear primeiro. Chame srandomdev () no AppDelegate. Aqui estão algumas funções auxiliares:
fonte