我正在寻找一种算法,我现在正在快速编程但是伪代码或任何类似的“C系列”语法都可以. 想象一下大量的值列表,例如位图中的像素.你想以视觉上随机的顺序挑选每一个,一次一个,并且
想象一下大量的值列表,例如位图中的像素.你想以视觉上随机的顺序挑选每一个,一次一个,并且永远不会选择相同的两个,并且最终总是挑选它们.
我之前在分形生成器中使用它,因此它不仅是逐行渲染,而是以随机方式慢慢构建,但很久以前,在Java小程序中,我不再拥有代码.
我不相信它使用任何伪随机数生成器,我喜欢它的主要原因是它没有使渲染时间比直线逐行方法花费更长的时间.我看到的任何改组算法都会使渲染需要更长的时间来处理这么多的值,除非我遗漏了一些东西.
编辑:我使用了洗牌阵列方法.当应用程序加载时我会洗牌一次,无论如何都不会花那么长时间.这是我的“经销商”课程的代码.
import Foundation import Cocoa import Quartz class 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 resolution const int ys=480; color pixel[sz]; // image data const int sz=xs*ys; // image size int adr[sz],i,j; for (i=0;i<sz;i++) adr[i]=i; // ordered positions for (i=0;i<sz;i++) // shuffle them { j = random(sz); // pseudo-randomness with uniform distribution swap(pixel[i],pixel[j]); }
通过这种方式,您可以确保每个像素都使用一次,并且很可能所有像素都被洗牌……