
想象一下大量的值列表,例如位图中的像素.你想以视觉上随机的顺序挑选每一个,一次一个,并且永远不会选择相同的两个,并且最终总是挑选它们.
我之前在分形生成器中使用它,因此它不仅是逐行渲染,而是以随机方式慢慢构建,但很久以前,在Java小程序中,我不再拥有代码.
我不相信它使用任何伪随机数生成器,我喜欢它的主要原因是它没有使渲染时间比直线逐行方法花费更长的时间.我看到的任何改组算法都会使渲染需要更长的时间来处理这么多的值,除非我遗漏了一些东西.
编辑:我使用了洗牌阵列方法.当应用程序加载时我会洗牌一次,无论如何都不会花那么长时间.这是我的“经销商”课程的代码.
import Foundationimport Cocoaimport Quartzclass Dealer: NSObject{ //######################################################## var deck = [(CGfloat,CGfloat)]() var count = 0 //######################################################## init(_ w:Int,_ h:Int) { super.init() deck.reserveCapacity((w*h)+1) for y in 0...h { for x in 0...w { deck.append((CGfloat(x),CGfloat(y))) } } self.shuffle() } //######################################################## func shuffle() { var j:Int = 0 let total:Int = deck.count-1 for i:Int in 0...total { j = Int(arc4random_uniform(UInt32(total))) deck.swapAt(i,j) } } //######################################################## func deal() -> (CGfloat,CGfloat) { let result = deck[count] let total:Int = deck.count-1 if(count<total) { count=count+1 } else { count=0 } return(result) } //########################################################} init被调用一次,它调用shuffle,但如果你想要,你可以在需要时再次调用shuffle.
每当您需要“卡”时,请致电Deal.当“甲板”完成时,它循环到开头.
const int xs=640; // image resolutionconst int ys=480;color pixel[sz]; // image dataconst int sz=xs*ys; // image size int adr[sz],i,j;for (i=0;i<sz;i++) adr[i]=i; // ordered positionsfor (i=0;i<sz;i++) // shuffle them { j = random(sz); // pseudo-randomness with uniform distribution swap(pixel[i],pixel[j]); } 通过这种方式,您可以确保每个像素都使用一次,并且很可能所有像素都被洗牌……
总结以上是内存溢出为你收集整理的swift – 用于选择位图中每个像素而不重复的公式全部内容,希望文章能够帮你解决swift – 用于选择位图中每个像素而不重复的公式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)