你站在一个地牢里。在你面前,是一群5级书呆子。他们想要你为他们运行一场龙与地下城的游戏。
你进行了几次游戏,你的玩家正在升级,一切都很顺利。不过战斗有点慢。你决定拿出你的+4 Objective-C 戟,并编写一个 iPad 应用程序来自动化战斗中的 NPC 掷骰子。 书呆子们怒视着你。“算法生成的数字,”一个人咆哮道,“是真正随机的空洞模仿!你不能用伪随机的东西玷污我们神圣的游戏!”
你试图说服他用arc4random_uniform()
已经足够了……但失败了。书呆子们只满足于真正的随机性。他们把你拘禁起来,而你则拼命抓住你的 MacBook 写一个从 random.org 获取数据的类。
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY/YYYY-MM-dd"];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@%@",
@"http://www.random.org/files/",
[formatter stringFromDate:[NSDate date]],
@".bin"]];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:
[NSURLRequest requestWithURL:url] delegate:self];
一旦数据已保存,您可以从下载的字节中生成0-255的随机数。
-(int) nextInt:(int)start end:(int)end
{
int upperBound = end - start + 1;
unsigned char result;
int maxModulo = 255 - (255 % upperBound);
do {
NSRange range = {index, sizeof(char)};
[randos getBytes:&result range:range];
index += sizeof(char);
} while (result > maxModulo); //avoid modulo bias
result = result % upperBound;
result += start;
return result;
}
这些书呆子似乎很满意,但是另一个地牢主出现了!他要求你为他自己的目的提供软件副本。问题显而易见——如果你们都使用同一天的random.org数据,你们将得到相同的骰子点数集合!
因此,我的问题如下:我该如何修改random.org数据,使其保留“真正的随机性”,但在程序的每个实例中都是不同的?我可以想象一种解决方案,即从用户那里获取一些(据称是随机的)触摸板移动,就像TrueCrypt一样,但一旦我有了这个常数,我不确定接下来该怎么做。以某种方式使用我的常数对所有数字进行哈希处理?这将产生一个更大的数字;如果我只截断或取模它以得到骰子点数,那么统计学上是否可以?我不知道应采取哪些算法步骤。