Powinieneś użyć arc4random_uniform()
funkcji. Wykorzystuje doskonały algorytm do rand
. Nie musisz nawet ustawiać nasionka.
#include <stdlib.h>
// ...
// ...
int r = arc4random_uniform(74);
Strona arc4random
podręcznika:
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)
sposób opisany poniżej przez @yood. Znajduje się również w stdlib.h (po OS X 10.7 i iOS 4.3) i zapewnia bardziej jednolity rozkład liczb losowych. Sposób użyciaint r = arc4random_uniform(74);
Użyj
arc4random_uniform(upper_bound)
funkcji, aby wygenerować losową liczbę w zakresie. Poniższe wygeneruje liczbę od 0 do 73 włącznie.arc4random_uniform(upper_bound)
unika modulo stronniczości, jak opisano na stronie podręcznika:źródło
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_3
Jeśli test się nie powiedzie, wróć do innego rozwiązania.Zrobiłbyś tak samo jak C.
(zakładając, że miałeś na myśli włączenie 0, ale wykluczenie 74, co robi twój przykład Java)
Edycja: Zapraszam do zamiany
random()
lubarc4random()
narand()
(co, jak zauważyli inni, dość szczęśliwy).źródło
Pomyślałem, że mogę dodać metodę, której używam w wielu projektach.
Jeśli ostatecznie używam go w wielu plikach, zwykle deklaruję makro jako
Na przykład
Uwaga: Tylko dla iOS 4.3 / OS X 10.7 (Lion) i nowszych
źródło
To daje zmiennoprzecinkowych liczbę między 0 i 47
Lub po prostu
Zarówno dolna, jak i górna granica mogą być również ujemne . Poniższy przykładowy kod podaje losową liczbę między -35,76 a +12,09
Konwertuj wynik na zaokrągloną wartość całkowitą :
źródło
drand48
zamiast tego dla zmiennoprzecinkowych.Według strony podręcznika dla rand (3) rodzina funkcji rand została zdezaktualizowana przez random (3). Wynika to z faktu, że dolne 12 bitów rand () przechodzi przez cykliczny wzorzec. Aby uzyskać liczbę losową, po prostu uruchom generator, wywołując srandom () z niepodpisanym ziarnem, a następnie wywołaj random (). Tak więc odpowiednikiem powyższego kodu będzie
Będziesz musiał wywołać srandom () tylko raz w swoim programie, chyba że chcesz zmienić ziarno. Chociaż powiedziałeś, że nie chcesz dyskutować o naprawdę losowych wartościach, rand () jest dość złym generatorem liczb losowych, a random () nadal cierpi z powodu błędu modulo, ponieważ wygeneruje liczbę między 0 a RAND_MAX. Tak więc, np. Jeśli RAND_MAX wynosi 3, a chcesz losową liczbę od 0 do 2, masz dwa razy większe szanse na uzyskanie 0 niż 1 lub 2.
źródło
Lepszy w użyciu
arc4random_uniform
. Nie jest to jednak dostępne pod iOS 4.3. Na szczęście iOS wiąże ten symbol w czasie wykonywania, a nie w czasie kompilacji (więc nie używaj dyrektywy preprocesora #if, aby sprawdzić, czy jest dostępna).Najlepszym sposobem ustalenia, czy
arc4random_uniform
jest dostępny, jest zrobienie czegoś takiego:źródło
Napisałem własną klasę narzędzi liczb losowych tylko po to, aby mieć coś, co działałoby trochę bardziej jak Math.random () w Javie. Ma tylko dwie funkcje i wszystko jest wykonane w C.
Plik nagłówka:
Plik implementacyjny:
To dość klasyczny sposób generowania pseudolosowych. W mojej aplikacji delegowanej dzwonię:
Potem po prostu mówię:
Zauważ, że ta metoda zwraca liczbę losową od 0,0f (włącznie) do 1,0f (wyłącznie).
źródło
Istnieje już kilka świetnych, wyraźnych odpowiedzi, ale pytanie wymaga losowej liczby od 0 do 74. Użyj:
arc4random_uniform(75)
źródło
Począwszy od iOS 9 i OS X 10.11, możesz używać nowych klas GameplayKit do generowania liczb losowych na różne sposoby.
Masz do wyboru cztery typy źródeł: ogólne losowe źródło (bez nazwy, aż do systemu, który wybierze, co robi), liniowy congruential, ARC4 i Mersenne Twister. Mogą generować losowe liczby całkowite, zmiennoprzecinkowe i boole.
Na najprostszym poziomie możesz wygenerować losową liczbę z wbudowanego losowego źródła systemu, jak to:
To generuje liczbę między -2 147 483 648 a 2 147 483 647. Jeśli chcesz liczbę z zakresu od 0 do górnej granicy (wyłącznie), użyj tego:
GameplayKit ma wbudowane kilka wygodnych konstruktorów do pracy z kostkami. Na przykład możesz rzucić sześciościenną kostką w następujący sposób:
Ponadto możesz kształtować losowy rozkład, używając rzeczy takich jak
GKShuffledDistribution
.źródło
Wygeneruj losową liczbę od 0 do 99:
Wygeneruj losową liczbę od 500 do 1000:
źródło
// Poniższy przykład wygeneruje liczbę od 0 do 73.
Wynik:
losowa liczba: 72
liczba losowa krok 2: 52
źródło
Dla twórców gier użyj random () do generowania losowych. Prawdopodobnie co najmniej 5 razy szybszy niż użycie arc4random (). Odchylenie modulo nie stanowi problemu, szczególnie w grach, w przypadku generowania losowych przy użyciu pełnego zakresu random (). Pamiętaj, aby najpierw posiać. Wywołaj srandomdev () w AppDelegate. Oto kilka funkcji pomocniczych:
źródło