Skip to main content
Poker

Numeri pseudo casuali con Swift

Per generare numeri pseudocasuali in Swift è disponibile una vecchia funzione presente sin da iOS 4.3.

Si tratta della funzione arc4random_uniform che riceve come parametro un valore e restituisce casualmente un valore tra 0 (incluso) e il limite superiore (escluso). Quindi la funzione non genera mai valori negativi.

Qui di seguito trovate la dichiarazione:

Ecco un esempio di utilizzo.

Come avrete visto la funzione lavora con il tipo unsigned int a 32 bit mentre in Swift generalmente si usa il tipo Int (anch’esso a 32 bit). Tuttavia Int è differente da UInt32 in quanto rappresenta sia valori negativi che positivi. La metà dei valori rappresentati da UInt32 non sono quindi rappresentati da Int.

Sarebbe comodo poter gestire i numeri random in Swift senza doverci preoccupare della conversione tra UInt32 e Int.

Un modo più semplice per generare interi random

Recentemente sul sito StackOverflow un utente ha proposto una soluzione molto elegante che ho adattato per creare un’estensione di Int contenete un nuovo initializer.

Vediamo prima come usarla. Per generare un intero casuale compreso, ad esempio, tra 10 e 90 posso scrivere:

Tutto qui!

Basta invocare il costruttore di Int passando un Range di Int che, in Swift, può essere espresso digitando il valore inferiore, tre volte punto seguito dal valore superiore.

In questo caso il valore generato casualmente potrà equivalere all’estremo inferiore o superiore del range.

Un extension per Int

Digitando il codice precedente nel vostro progetto o playground otterrete il seguente messaggio di errore dal compilatore.

Cannot find an initializer of type ‘Int” that accepts an argument list of type ‘(Range<Int>)’.

Questo perché dovete aggiungere il nuovo initializer tramite un extension.

  • La riga#1 indica al compilatore che stiamo creando un extension per la struct Int.
  • La riga#2 dichiara un initializer il cui parametro è un Range di Int. Quel “_” indica che il nome del parametro deve essere omesso quando lo invochiamo.
  • La riga#3 calcola un delta nel caso il minimo del range sia negativo. Il delta viene usato per garantire che le costanti min e max siano non negative.
  • Alle righe #4 e #5 vengono calcolati il min e il max usando il delta e passando da valori di tipo Int e valori UInt32.
  • Alla riga#6 viene invocata arc4random_uniform passando valori UInt32 e il risultato viene eventualmente traslato verso i numeri positivi e convertito in Int.

Per usare questa estensione nel vostro progetto dovete semplicemente incollare questo codice in un qualsiasi sorgente Swift del vostro progetto. Il mio consiglio è di creare un file (ad esempio Extensions.swift) in cui aggiungere le estensioni che di volta in volta troverete utili.

Trainer • Developer • Writer

Luca Angeletti

Trainer • Developer • Writer

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *