如何使用`CIRandomGenerator`滤镜获取不同的随机图像?

4

我认为无论是多次引用实例的outputImage还是实例化新过滤器,CIFilter(name: "CIRandomGenerator")的输出始终相同:

import CoreImage
let randomFilter = CIFilter(name: "CIRandomGenerator")
let outputImage = randomFilter!.outputImage!.cropped(to: (CGRect(x: 0, y: 0, width: 100, height: 100)))
let outputImage2 = randomFilter!.outputImage!.cropped(to: (CGRect(x: 0, y: 0, width: 100, height: 100)))
// pause for some amount of time so that it's definitely not 
// instantiating a PRNG with the same timestamp
let rf2 = CIFilter(name: "CIRandomGenerator")
rf2!.outputImage!.cropped(to: (CGRect(x: 0, y: 0, width: 100, height: 100)))

导致结果如下: playground output 如果你仔细观察像素,你会发现它们都是一样的。
我没有看到任何可以传递以正确初始化伪随机数生成器的种子参数。
由于CIFilter具有无限的范围,在调用“裁剪”时可以随机偏移位置,这似乎可以正常工作,但这似乎是一种hack方法。我是否遗漏了初始化/“getNext”此随机过滤器的正确方法?
1个回答

3

我本来想将这个回答作为评论,但我觉得它值得成为答案。

你已经很正确地描述了它。考虑一下 - 什么是随机数生成器?当然,它可能需要一个“种子”,但最终大多数生成器在反复运行时会提供一个相当可预测的数字。(前提是您没有开始向方程中添加其他内容。)

因此,CIRandomGenerator 的输出可以被视为同样的东西。从(0,0)取出后,它的输出在无限远处看起来是“随机”的。但是一旦您“播种” - 给予另一个原点而不是(0,0)- 您就实际上“捕获”了大多数人认为是“随机”的事物。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接