Swift-使用泛型范围获取数组或区间中随机元素
2017-05-12 12:10
260 查看
实际开发中,通常会遇到获取一个随机数
随机产生一个数字
随机获取数组中的一个元素
随机获取一种颜色
…
可以使用一个半开的区间调用这个函数
但是不能传入一个闭合的区间:
从一个字符数组中随机获取一个元素
从数组中随机返回元素
参考于霍曼·梅尔:How to be DRY on ranges and closed ranges?
当我们尝试从随机函数中筛选出基本接口,即所需实现的最小功能集合:
它需要一种有效的方法来计算输入序列的下限和上限之间的距离。
它需要一种有效的方式来检索输入序列的第 n 个元素以便将其返回,其中 n 是从其长度的下界计算得到的随机距离。
霍曼注意到两个可计数的区间类型都遵守协议 RandomAccessCollection ,共享该公共协议的一致性。事实上,RandomAccessCollection 提供了我们想要的基本接口:可随机访问的集合保证了所需开销时间都是恒定的,而这些开销主要集中在测量索引间距离以及访问任意索引所指向的元素。
因此,把 random 函数定义成 RandomAccessCollection 中的方法
随机函数的使用
获取随机颜色
随机产生一个数字
随机获取数组中的一个元素
随机获取一种颜色
…
简单介绍:
一、最简单操作:给定一个最大值,随机获取一个0到最大值之间的数字
let int = arc4random_uniform(100)
二、从一个范围中返回一个随机数
不足:此方法只支持返回一个半开区间 (x..// 使用 upperBound 和 lowerBound需要导入改头文件 import Darwin func randomNumber(from range: Range<Int>) -> Int { let distance = range.upperBound - range.lowerBound let rnd = arc4random_uniform(UInt32(distance)) return range.lowerBound + Int(rnd) }
可以使用一个半开的区间调用这个函数
let random1 = randomNumber(from: 1..<10)
但是不能传入一个闭合的区间:
let random2 = randomNumber(from: 1...9) // error
三、随机获取字符数组中的一个元素,数组内元素必须是字符串
func randomStringFromArray(from array: Array<Any>) -> String { let index: Int = Int(arc4random_uniform(UInt32(array.count))) return array[index] as! String }
从一个字符数组中随机获取一个元素
let array = ["Mazy","Lucy","Lily","Vivian","Owen"] let element = randomStringFromArray(from: array)
四、利用泛型随机获取数组中的一个元素,数组内可以是任意元素
func randomElementFromArray<T>(from array: Array<T>) -> T { let index: Int = Int(arc4random_uniform(UInt32(array.count))) return array[index] }
从数组中随机返回元素
// 字符串数组 let array = ["Mazy","Lucy","Lily","Vivian","Owen"] let element = randomElementFromArray(from: array) // 数字数组 let array1 = [1,5,8,32,7,88,6] let num = randomElementFromArray(from: array1)
五、思考:有没有一个方法,传入区间或数组,返回一个随机元素?
通过识别基本接口编写通用代码参考于霍曼·梅尔:How to be DRY on ranges and closed ranges?
当我们尝试从随机函数中筛选出基本接口,即所需实现的最小功能集合:
它需要一种有效的方法来计算输入序列的下限和上限之间的距离。
它需要一种有效的方式来检索输入序列的第 n 个元素以便将其返回,其中 n 是从其长度的下界计算得到的随机距离。
霍曼注意到两个可计数的区间类型都遵守协议 RandomAccessCollection ,共享该公共协议的一致性。事实上,RandomAccessCollection 提供了我们想要的基本接口:可随机访问的集合保证了所需开销时间都是恒定的,而这些开销主要集中在测量索引间距离以及访问任意索引所指向的元素。
因此,把 random 函数定义成 RandomAccessCollection 中的方法
// MARK: - 随机函数筛选元素 extension RandomAccessCollection { func random() -> Iterator.Element? { guard count > 0 else { return nil } let offset = arc4random_uniform(numericCast(count)) let i = index(startIndex, offsetBy: numericCast(offset)) return self[i] } }
随机函数的使用
// 获取区间的中随机数 let a = (50...100).random() // 闭区间 let b = (0..<9).random() // 开区间 let array = ["Mazy","Lucy","Lily","Vivian","Owen"] let name = array.random()
六、随机函数的高级使用
结合随机函数,给 UIColor 添加 extension 获取一个随机颜色
extension UIColor { static var randomColor: UIColor { get { let r: CGFloat = CGFloat((0...255).random()!)/255.0 let g: CGFloat = CGFloat((0...255).random()!)/255.0 let b: CGFloat = CGFloat((0...255).random()!)/255.0 // 或者使用一下原生函数获取随机数 /* let redValue = CGFloat(Int(arc4random() % 255)) / 255.0 let blueValue = CGFloat(Int(arc4random() % 255)) / 255.0 let greenValue = CGFloat(Int(arc4random() % 255)) / 255.0 */ return UIColor(red: r, green: g, blue: b, alpha: 1.0) } } }
获取随机颜色
let color = UIColor.randomColor
相关文章推荐
- 使用泛型, 写一个为任意类型的动态数组添加元素的方法
- 3.定义两个整型指针,分别用malloc、calloc对其分配空间保存3个元素,malloc分配的空间用memset清零,随机对数组进行赋值随机范围1-3,赋值后用memcmp比较两个数组。如果相同打
- js中获取同名的元素--使用getElementsByName()函数获得数组
- 不重复地随机获取List或者数组元素
- 使用js的splice()从数组中随机抽出几个元素
- 使用泛型的 TArray 从动态数组中查找指定元素
- 使用mongodb的aggregate实现获取数组最后一个元素
- 随机打乱一个数组,无重复的获取一定范围内的随机数
- php使用array_rand()函数从数组中随机选择一个或多个元素
- js实现从数组里随机获取元素
- 3 定义两个整型指针,分别用malloc、calloc对其分配空间保存3个元素,malloc分配的空间用memset清零,随机对数组进行赋值随机范围1-3,赋值后用memcmp比较两个数组。如果相同
- 使用BeanUtils.describe将对象转换成Map时,数组字段的值只获取到第一个元素
- js获取数组任意个不重复的随机数组元素 原创
- 定义两个整型指针,分别用malloc、calloc对其分配空间保存3个元素,malloc分配的空间用memset清零,随机对数组进行赋值随机范围1-3,赋值后用memcmp比较两个数组。如果相同打印G
- 定义两个整型指针,分别用malloc、calloc对其分配空间保存3个元素,malloc分配的空间用memset清零,随机对数组进行赋值随机范围1-3,赋值后用memcmp比较两个数组。如果相同打印G
- js实现从数组里随机获取元素
- 从数组中返回随机元素(python中的random模块的使用)
- 生成有n个元素的随机数组 并设置随机元素的范围
- 【Java】随机生成范围[min,max]之间的整数数组,且元素值不重复
- 随机生成一个 10 个元素的数组,找到 x 的倍数,并将其值修改成 0.(注意:修改数值使用回掉函数处理)