国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Swift 中隨機(jī)數(shù)的使用總結(jié)

移動開發(fā)
在我們開發(fā)的過程中,時不時地需要產(chǎn)生一些隨機(jī)數(shù)。這里我們總結(jié)一下Swift中常用的一些隨機(jī)數(shù)生成函數(shù)。這里我們將在Playground中來做些示例演示。

在我們開發(fā)的過程中,時不時地需要產(chǎn)生一些隨機(jī)數(shù)。這里我們總結(jié)一下Swift中常用的一些隨機(jī)數(shù)生成函數(shù)。這里我們將在Playground中來做些示例演示。

整型隨機(jī)數(shù)

如果我們想要一個整型的隨機(jī)數(shù),則可以考慮用arc4random系列函數(shù)。我們可以通過man arc4random命令來看一下這個函數(shù)的定義:

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 inabout (21700) states. The arc4random() function returns pseudo-random numbers in the range of 0 to (232)-1, and therefore has twice the range of rand(3) and random(3).

arc4random使用了arc4密碼加密的key stream生成器(請腦補(bǔ)),產(chǎn)生一個[0, 2^32)區(qū)間的隨機(jī)數(shù)(注意是左閉右開區(qū)間)。這個函數(shù)的返回類型是UInt32。如下所示:

  1. arc4random() // 2,919,646,954 

如果我們想生成一個指定范圍內(nèi)的整型隨機(jī)數(shù),則可以使用arc4random() % upper_bound的方式,其中upper_bound指定的是上邊界,如下處理:

  1. arc4random() % 10 // 8 

不過使用這種方法,在upper_bound不是2的冪次方時,會產(chǎn)生一個所謂Modulo bias(模偏差)的問題。

我們在控制臺中通過man arc4random命令,可以查看arc4random的文檔,有這么一條:

arc4random_uniform() will return a uniformly distributed random number less than upper_bound. arc4random_uniform() is recommended over constructions like ‘’arc4random() % upper_bound’‘ as it avoids “modulo bias” when the upper bound is not a power of two.

因此可以使用arc4random_uniform,它接受一個UInt32類型的參數(shù),指定隨機(jī)數(shù)區(qū)間的上邊界upper_bound,該函數(shù)生成的隨機(jī)數(shù)范圍是[0, upper_bound),如下所示:

  1. arc4random_uniform(10// 6 

而如果想指定區(qū)間的最小值(如隨機(jī)數(shù)區(qū)間在[5, 100)),則可以如下處理:

  1. let max: UInt32 = 100 
  2. let min: UInt32 = 5 
  3. arc4random_uniform(max - min) + min // 82 

當(dāng)然,在Swift中也可以使用傳統(tǒng)的C函數(shù)rand與random。不過這兩個函數(shù)有如下幾個缺點(diǎn):

這兩個函數(shù)都需要初始種子,通常是以當(dāng)前時間來確定。

這兩個函數(shù)的上限在RAND_MAX=0X7fffffff(2147483647),是arc4random的一半。

rand函數(shù)以有規(guī)律的低位循環(huán)方式實(shí)現(xiàn),更容易預(yù)測

我們以rand為例,看看其使用:

  1. srand(UInt32(time(nil))) // 種子,random對應(yīng)的是srandom 
  2. rand() // 1,314,695,483 
  3. rand() % 10 // 8 

64位整型隨機(jī)數(shù)

在大部分應(yīng)用中,上面講到的幾個函數(shù)已經(jīng)足夠滿足我們獲取整型隨機(jī)數(shù)的需求了。不過我們看看它們的函數(shù)聲明,可以發(fā)現(xiàn)這些函數(shù)主要是針對32位整型來操作的。如果我們需要生成一個64位的整型隨機(jī)數(shù)呢?畢竟現(xiàn)在的新機(jī)器都是支持64位的了。

目前貌似沒有現(xiàn)成的函數(shù)來生成64位的隨機(jī)數(shù),不過jstn在stackoverflow上為我們分享了他的方法。我們一起來看看。

他首先定義了一個泛型函數(shù),如下所示:

  1. func arc4random (type: T.Type) -> T { 
  2. var r: T = 0 
  3. arc4random_buf(&r, UInt(sizeof(T))) 
  4. return r 

這個函數(shù)中使用了arc4random_buf來生成隨機(jī)數(shù)。讓我們通過man arc4random_buf來看看這個函數(shù)的定義:

arc4random_buf() function fills the region buf of length nbytes with ARC4-derived random data.

這個函數(shù)使用ARC4加密的隨機(jī)數(shù)來填充該函數(shù)第二個參數(shù)指定的長度的緩存區(qū)域。因此,如果我們傳入的是sizeof(UInt64),該函數(shù)便會生成一個隨機(jī)數(shù)來填充8個字節(jié)的區(qū)域,并返回給r。那么64位的隨機(jī)數(shù)生成方法便可以如下實(shí)現(xiàn):

  1. extension UInt64 { 
  2. static func random(lower: UInt64 = min, upper: UInt64 = max) -> UInt64 { 
  3. var m: UInt64 
  4. let u = upper - lower 
  5. var r = arc4random(UInt64) 
  6. if u > UInt64(Int64.max) { 
  7. m = 1 + ~u 
  8. else { 
  9. m = ((max - (u * 2)) + 1) % u 
  10. while r < m { 
  11. r = arc4random(UInt64) 
  12. return (r % u) + lower 

我們來試用一下:

  1. UInt64.random() // 4758246381445086013 

當(dāng)然jstn還提供了Int64,UInt32,Int32的實(shí)現(xiàn),大家可以腦補(bǔ)一下。

浮點(diǎn)型隨機(jī)數(shù)

如果需要一個浮點(diǎn)值的隨機(jī)數(shù),則可以使用drand48函數(shù),這個函數(shù)產(chǎn)生一個[0.0, 1.0]區(qū)間中的浮點(diǎn)數(shù)。這個函數(shù)的返回值是Double類型。其使用如下所示:

  1. srand48(Int(time(nil))) 
  2. drand48() // 0.396464773760275 

記住這個函數(shù)是需要先調(diào)用srand48生成一個種子的初始值。

一個小示例

最近寫了一個隨機(jī)鍵盤,需要對0-9這幾個數(shù)字做個隨機(jī)排序,正好用上了上面的arc4random函數(shù),如下所示:

  1. let arr = ["0""1""2""3""4""5""6""7""8""9"
  2. let numbers = arr.sort { (_, _) -> Bool in 
  3. arc4random() < arc4random() 

在閉包中,隨機(jī)生成兩個數(shù),比較它們之間的大小,來確定數(shù)組的排序規(guī)則。還是挺簡單的。

小結(jié)

其實(shí)如果翻看一下Swift中關(guān)于C函數(shù)的API,發(fā)現(xiàn)還有許多跟隨機(jī)數(shù)相關(guān)的函數(shù),如arc4random_addrandom,erand48等。上面的只是我們經(jīng)常用到的一些函數(shù),這幾個函數(shù)基本上夠用了。當(dāng)然,不同場景有不同的需求,我們需要根據(jù)實(shí)際的需求來選擇合適的函數(shù)。

以上的代碼已上傳到github,地址是Random.playground有需要的可以參考一下。

責(zé)任編輯:chenqingxiang 來源: 南峰子的技術(shù)博客
相關(guān)推薦

2012-03-22 09:31:14

Java

2021-12-27 09:31:20

HashtableJava隨機(jī)數(shù)

2019-09-11 10:09:00

Java虛擬機(jī)算法

2021-06-01 22:31:57

區(qū)塊鏈隨機(jī)數(shù)技術(shù)

2009-12-02 17:01:01

PHP隨機(jī)數(shù)rand()

2010-09-06 17:40:59

SQL函數(shù)

2014-04-25 10:14:39

2023-01-03 07:49:45

Java隨機(jī)數(shù)線程

2009-06-11 15:38:00

Java隨機(jī)數(shù)

2024-11-01 15:51:06

2011-05-24 17:08:57

rand()srand()

2011-07-08 15:11:03

JAVA

2010-10-09 15:35:25

MySQL rand函

2024-01-25 11:32:21

2009-06-11 15:25:39

Java隨機(jī)數(shù)

2010-03-22 19:41:31

2017-05-29 09:56:25

2009-12-08 11:44:14

PHP獲取隨機(jī)數(shù)

2009-06-11 15:16:18

不重復(fù)隨機(jī)數(shù)Java

2010-07-15 13:34:32

Perl隨機(jī)數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

伊人久久大香线蕉无限次| 欧美日韩另类一区| 亚洲精品福利电影| 亚洲伊人成综合成人网| 国产亚洲一二三区| 欧美高清免费| 欧美一级中文字幕| 日韩国产精品视频| 韩国av一区二区三区四区| av在线不卡免费| 性刺激综合网| 欧美大片一区二区| 亚洲欧洲另类| 成黄免费在线| 古典武侠综合av第一页| 欧美性xxxx极品高清hd直播| 午夜精品久久久久久久四虎美女版| 美日韩黄色片| 国产精品久久久久久搜索| 亚洲精品你懂的| 精品久久久久久久| 亚洲高清成人影院| 波多野结衣成人在线| 欧美亚洲综合另类| 99在线观看免费视频精品观看| 午夜伦理在线| 欧美福利精品| 日韩av在线影院| 国产精品一区二区果冻传媒| 免费成人直播| 少妇高清精品毛片在线视频| 欧美理论片在线观看| 国产亚洲成aⅴ人片在线观看| 久久资源综合| 色网在线视频| 国产精品久久波多野结衣| 日韩女优av电影| 成人听书哪个软件好| 久久三级中文| 香港经典三级在线| 国产福利一区二区三区在线观看| 欧美精品黑人性xxxx| 人妖欧美一区二区| 国产精品丝袜白浆摸在线| 51蜜桃传媒精品一区二区| 亚洲免费视频播放| 富二代精品短视频| 亚洲激情偷拍| 超碰成人av| 久久久噜噜噜www成人网| 欧美性受xxxx白人性爽| 国产一区二区三区免费播放 | 成人精品视频| 久草.com| 99视频网站| 精品国产凹凸成av人导航| 福利一区在线观看| 日韩精品999| 欧美成人h版在线观看| 中文字幕综合在线| 成人私拍视频| 日本888xxxx| 成人福利在线观看| 欧美精品一区二区精品网| 成人av动漫在线| 国内黄色精品| 国产精品一区hongkong| 男操女免费网站| 国产精品国产一区二区| 亚洲美女视频网站| 久久嫩草精品久久久精品| 亚洲无中文字幕| 成人h在线观看| 阳光姐妹淘韩国版| 日韩三级电影免费观看| 777精品视频| 欧美岛国在线观看| 亚洲精品国产一区二区精华液 | 成人三级伦理片| 成人写真视频| 波多野结衣在线观看| 在线观看成人网| 欧美性天天影院| 午夜精品久久17c| 欧美成人vps| 亚洲人吸女人奶水| 麻豆精品视频在线| 成人久久电影| 国产精品高清乱码在线观看| 影音先锋电影在线观看| 国产精品久久久久7777| www.久久久| 久久久久久久久久久人体| 日韩天堂在线观看| 国产成人a视频高清在线观看| 亚洲视频一区| 久久嫩草精品久久久精品| 欧美理论电影在线观看| 国产一区二区三区四区五区美女| 九九热播视频在线精品6| 91大神在线网站| 国产精品拍拍拍| 五月天国产一区| 国产日韩欧美在线看| 中文字幕亚洲二区| 欧美日韩一区高清| 亚洲欧洲成人自拍| 精品综合久久久久久8888| 欧美wwwww| 亚洲成人偷拍| 123区在线| 久久久久久久久亚洲精品| 韩国日本美国免费毛片| 日韩欧美在线一区二区| 国产精品网站入口| 超碰精品一区二区三区乱码| 精品久久久久久久久久久久久久久| 亚洲欧美色图小说| 成人污污视频在线观看| 久久青草久久| 国产精品亚洲二区| 99视频有精品高清视频| 成人影音在线| 国产精品秘入口| 99视频资源网| 国产午夜福利100集发布| 欧美日韩一区综合| 亚洲一区二区三区视频| 欧美影院久久久| 另类少妇人与禽zozz0性伦| 日韩精品在线观看一区二区| 欧美日韩电影在线| 欧美日韩美女在线| 一区二区三区在线观看国产| 国产视频在线观看一区二区三区| 国产精品亚洲а∨天堂免在线| 国产亚洲在线| 精久久久久久| 91tv精品福利国产在线观看| 国产精品视频一区二区三区四蜜臂| 亚洲精品午夜| 久久亚洲资源中文字| 中文不卡1区2区3区| 日本大胆在线观看| 超碰在线网址| 在线看三级电影| 超碰最新在线| 成人免费网站在线观看视频| 午夜小视频在线| 四虎久久免费| 超碰免费97在线观看| 国产一级二级三级在线观看| 亚洲一区二区三区精品中文字幕| www.99av| 成人在线电影网| 91淫黄看大片| 爱情岛论坛vip永久入口| 国产亚洲天堂网| 国产亚洲黄色片| 黄色一级视频在线播放| 日韩精品在线中文字幕| 日韩一二区视频| 国产人妻互换一区二区| 蜜桃网站在线观看| 国产午夜福利100集发布| av观看免费在线| 天天插天天操天天射| 黄色漫画在线免费观看| а√最新版天堂中文在线| www.成人69.com| 97国产在线| 中文在线a√在线8| 国产精品影院在线| 成码无人av片在线观看网站| 日本在线啊啊| 欧洲亚洲精品| 香蕉大人久久国产成人av| xx欧美xxx| 久久av资源网站| 99热国产在线中文| 国产综合动作在线观看| 国产一区自拍视频| 午夜欧美性电影| 亚洲五码在线观看视频| 欧美一级视频免费看| 欧美精品无码一区二区三区| 4kfree性满足欧美hd18| 一级二级在线观看| 在线免费观看黄色网址| 3344国产永久在线观看视频| 成人午夜毛片| 久久97久久97精品免视看秋霞| 99精品美女| 爽好久久久欧美精品| 国产91精品免费| 国产精品久久久久婷婷二区次| 天天影视色香欲综合网老头| 91精品麻豆日日躁夜夜躁| 亚洲免费伊人电影在线观看av| 欧美激情视频在线观看|