在Obj-C中,我通过在字符“A”中添加0到25之间的随机值来生成随机数字:
'A' + arc4random() % 26
在swift中,我发现这样做的唯一方法如下
func +(left: Character,right: Int) -> Character { let oldCharUnicodeScalars = String(left).unicodeScalars let newCharIntRepresentation = Int(oldCharUnicodeScalars[oldCharUnicodeScalars.startIndex].value) + right return Character("\(UnicodeScalar(newCharIntRepresentation))") } let rndChar = String(Character("A") + Int(arc4random()%26))
我想知道是否有更简单,更灵活的东西.
解决方法
您可以结合使用一些东西来创建类似于原始解决方案的单行程序(我不会真的称之为更灵活):
var rndChar = String(UnicodeScalar("A".utf16[0] + Int(arc4random_uniform(26))))
String的utf16属性返回一个UTF16View
,然后您可以使用Int(0)进行索引以获取第一个字符的UInt16表示形式(在本例中为唯一字符“A”).然后,将0到25之间的随机数添加到它,将其传递给UnicodeScalar的构造函数,并将该UnicodeScalar传递给String构造函数…… whew.
另一种方法,如果你只是在寻找“A”和“Z”之间的随机字符,那就是从你想要的字符串中创建一个数组,然后从该数组中获取一个随机项:
var rndChar = Array("ABCDEFGHIJKLMnopQRSTUVWXYZ")[Int(arc4random_uniform(26))]
旁注:我建议使用arc4random_uniform(26)而不是arc4random()%26,因为它会给出一个更一致的随机数:
arc4random_uniform()
will return a uniformly distributed random number less than upper_bound.arc4random_uniform()
is recommended over constructions likearc4random() % upper_bound
as it avoids “modulo bias” when the upper bound is not a power of two.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。