用随机函数如何产生随机数10个50以内的随机数存入一堆数组,通过键盘输入数值X,在数组中查找X

在我们开发的过程中时不时地需要如何产生随机数一些随机数。这里我们总结一下Swift中常用的一些随机数生成函数这里我们将在Playground中来做些示例演示。

如果我们想要一个整型的随机数则可以考虑用arc4random系列函数。我们可以通过man arc4random命令来看一下这个函数的定义:

arc4random使用了arc4密码加密的key stream生成器(请脑补)如何产生随机数┅个[0, 2^32)区间的随机数(注意是左闭右开区间)。这个函数的返回类型是UInt32如下所示:

如果我们想生成一个指定范围内的整型随机数,则可以使用arc4random() % upper_bound嘚方式其中upper_bound指定的是上边界,如下处理:

不过使用这种方法在upper_bound不是2的幂次方时,会如何产生随机数一个所谓的问题

我们在控制台中通过man arc4random命令,可以查看arc4random的文档有这么一条:

而如果想指定区间的最小值(如随机数区间在[5, 100)),则可以如下处理:

当然在Swift中也可以使用传統的C函数rand与random。不过这两个函数有如下几个缺点:

这两个函数都需要初始种子通常是以当前时间来确定。

rand函数以有规律的低位循环方式实現更容易预测

我们以rand为例,看看其使用:

在大部分应用中上面讲到的几个函数已经足够满足我们获取整型随机数的需求了。不过我们看看它们的函数声明可以发现这些函数主要是针对32位整型来操作的。如果我们需要生成一个64位的整型随机数呢毕竟现在的新机器都是支持64位的了。

目前貌似没有现成的函数来生成64位的随机数不过jstn在stackoverflow上为我们分享了他的方法。我们一起来看看

他首先定义了一个泛型函數,如下所示:

这个函数使用ARC4加密的随机数来填充该函数第二个参数指定的长度的缓存区域因此,如果我们传入的是sizeof(UInt64)该函数便会生成┅个随机数来填充8个字节的区域,并返回给r那么64位的随机数生成方法便可以如下实现:

当然jstn还提供了Int64,UInt32Int32的实现,大家可以脑补一下

洳果需要一个浮点值的随机数,则可以使用drand48函数这个函数如何产生随机数一个[0.0, 1.0]区间中的浮点数。这个函数的返回值是Double类型其使用如下所示:

记住这个函数是需要先调用srand48生成一个种子的初始值。

最近写了一个随机键盘需要对0-9这几个数字做个随机排序,正好用上了上面的arc4random函数如下所示:

在闭包中,随机生成两个数比较它们之间的大小,来确定数组的排序规则还是挺简单的。

其实如果翻看一下Swift中关于C函数的API发现还有许多跟随机数相关的函数,如arc4random_addrandomerand48等。上面的只是我们经常用到的一些函数这几个函数基本上够用了。当然不同场景囿不同的需求,我们需要根据实际的需求来选择合适的函数

以上的代码已上传到github,地址是有需要的可以参考一下

如果你如何产生随机数的是随机數的话其实你不必担心取到某个特定数值。

首先从概率的角度,你如何产生随机数的随机数正好取到某个特定数值的概率为 0所以,鈈论你指定的是什么特定数值你都不可能取到该数值。其次从 Matlab 浮点数的精度看,你不可能得到正好等于该特定数的浮点数

所以,其實你大可以直接用 rand 函数这个是可以验证的:

说明即使如何产生随机数了 1e6 个随机数,也没有一个等于 0.5 的

不过,如果你是担心跟某个特定數值的距离太近那倒是有必要去去判断一下,因为此时随机数是落入一个区间里,这个概率是不为0的

我要回帖

更多关于 如何产生随机数 的文章

 

随机推荐