我已经看到这个问题了很多但从未见过真正的具体答案.所以我将在这里发布一个,希望能帮助人们理解为什么在使用随机数生成器时会出现"模数偏差",就像rand()在C++中一样.
所以我看过关于Obj中随机和arc4random之间差异的旧帖子.C,我已经在网上看到了这个答案,但我并没有真正理解答案,所以我希望有人可以用更容易理解的方式解释它.
使用random和arc4random生成随机数有什么区别?
我写了一个简单的Bag类.袋子装有固定比例的温度枚举.它允许您随机抓取一个并在空时自动重新填充.它看起来像这样:
class Bag {
var items = Temperature[]()
init () {
refill()
}
func grab()-> Temperature {
if items.isEmpty {
refill()
}
var i = Int(arc4random()) % items.count
return items.removeAtIndex(i)
}
func refill() {
items.append(.Normal)
items.append(.Hot)
items.append(.Hot)
items.append(.Cold)
items.append(.Cold)
}
}
Run Code Online (Sandbox Code Playgroud)
温度枚举如下所示:
enum Temperature: Int {
case Normal, Hot, Cold
}
Run Code Online (Sandbox Code Playgroud)
我GameScene:SKScene有一个常量实例属性bag:Bag.(我用一个变量试为好.)当我需要一个新的温度我打电话bag.grab()的,一旦didMoveToView当适当touchesEnded.
随机此调用崩溃的if items.isEmpty一致Bag.grab().错误是EXC_BAD_INSTRUCTION.检查调试器显示项目是size=1和[0] = (AppName.Temperature) <invalid> (0x10).
编辑看起来我不懂调试器信息.即使有效的数组显示 …
我需要在我的游戏中创建一个随机的bool值,在Swift中.
基本上,如果是(或1),则生成一个对象,如果否(或0),则生成另一个对象.
let randomSequenceNumber = Int(arc4random_uniform(2))
Run Code Online (Sandbox Code Playgroud)
现在它有效,但似乎偏向于0对我来说......就像荒谬的偏见......
这就是我如何使用该值:
if(randomSequenceNumber == 0)
//spawn object A
else
//spawn object B
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来使用随机bool值来实现它?那不是偏向某个值吗?
更新
在10,000次通话中产生了一个实验来看看有多少1人的比赛0:
func experiment() {
var numbers: [Int] = []
var tester: Int = 0
var sum = 0
for i in 0...10000 {
tester = Int(arc4random_uniform(2))
numbers.append(tester)
print(i)
}
for number in numbers {
sum += number
}
print("Total 1's: ", sum)
}
Test 1: Console Output: Total 1's: …Run Code Online (Sandbox Code Playgroud) 我在Ubuntu中使用Swift,我收到一个错误,arc4random是一个未解析的标识符.在这个已知的错误的详细信息在这里.基本上,该功能仅存在于BSD发行版中.我已经尝试过模块映射头文件,apt-getting包,并且我得到越来越多的错误,这是不值得追求的,因为这个函数不经常使用.
是否有任何函数可以获取具有与Linux中的Swift兼容的上限参数的伪随机数?
我的程序中有一个小错误。
我的应用程序中有 firebase 存储。我想让用户将图像上传到存储。
问题是当用户上传图像然后尝试上传另一张图像时。该程序会覆盖之前上传的图像。
我想要的是当用户想要上传另一张图像时避免“覆盖”。并将两个图像保存在不同的文件中
let currentUser = Auth.auth().currentUser
let StorageRefrenece = Storage.storage().reference()
let posterImageRef =
StorageRefrenece.child("posters").child(currentUser!.uid).child("posterOne.jpg")
Run Code Online (Sandbox Code Playgroud)
谢谢
根据这个文档,
arc4random_uniform()建议使用结构,arc4random() % upper_bound因为当上限不是2的幂时,它避免了"模偏差".
偏见有多糟糕?例如,如果我生成上限为6的随机数,使用和之间arc4random有什么区别?%arc4random_uniform()
我对Swift和编程逻辑都很陌生,所以请耐心等待
如何在Swift中生成0到9之间的随机数,而不重复上一次生成的数字?因为相同的数字不会连续出现两次.
我有一个Swift函数做这样的事情:
func f() -> Int {
switch (__WORDSIZE) {
case 32: return 1
case 64: return 2
default: return 0
}
}
Run Code Online (Sandbox Code Playgroud)
因为__WORDSIZE是常量,所以编译器总是在开关体中给出至少一个警告.实际标记了哪些行取决于我正在构建的目标(例如iPhone 5对6;有趣的是iPhone 5给出了64位情况的警告,而iPhone 6给出了32位和默认的两个警告).
我发现,雨燕的等价物#pragma是// MARK:,所以我尝试
// MARK: clang diagnostic push
// MARK: clang diagnostic ignored "-Wall"
func f() -> Int {
switch (__WORDSIZE) {
case 32: return 1
case 64: return 2
default: return 0
}
}
// MARK: clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)
但警告仍然存在,MARKs似乎没有效果.
作为一种解决方法,我现在有这样的事情:
#if arch(arm) || arch(i386)
return …Run Code Online (Sandbox Code Playgroud) TL:博士; 如何生成随机数,因为书中的方法每次都会选择相同的数字.
根据Apple发布的书,这似乎是Swift生成随机数的方式.
protocol RandomNumberGenerator {
func random() -> Double
}
class LinearCongruentialGenerator: RandomNumberGenerator {
var lastRandom = 42.0
let m = 139968.0
let a = 3877.0
let c = 29573.0
func random() -> Double {
lastRandom = ((lastRandom * a + c) % m)
return lastRandom / m
}
}
let generator = LinearCongruentialGenerator()
for _ in 1..10 {
// Generate "random" number from 1-10
println(Int(generator.random() * 10)+1)
}
Run Code Online (Sandbox Code Playgroud)
问题是,在我放在底部的for循环中,输出如下所示:
4
8
7
8
6
2
6
4
1 …Run Code Online (Sandbox Code Playgroud) swift ×7
random ×6
arc4random ×2
objective-c ×2
boolean ×1
c++ ×1
firebase ×1
modulo ×1
probability ×1
swift2 ×1
swift3 ×1
ubuntu-16.04 ×1