Jus*_*808 8 random algorithm math
代码在Objective C中但是如果你查看它就应该是可以理解的,即使你不知道Objective C.基本上它是一个RNG对象,你实例化一个新实例,如果你想要设置种子并开始抓取随机数.
那么是否可以回溯一系列给定的数字以确定用于生成数字的种子?我猜测任何给定的算法都不能生成任何随机的数字集,或者它可以吗?
说我做以下事情:
rng.seed = 1024;
for (int i=1; i<11; i++)
DLog(@"%lu", [rng randomBetween:0 and:10]);
Run Code Online (Sandbox Code Playgroud)
这给了我序列10, 10, 8, 10, 2, 10, 9, 9, 7, 4.在给定序列的情况下,是否有一些方法或算法可以使用1024来获得数字?我知道那对看到1024的有效序列,但什么是我只是做了一个序列... 10, 1, 9, 6, 3, 9, 10, 3, 5, 2.有没有办法知道这是否是这个算法的有效序列,如果是的话,种子是什么?
RNG.h:
@interface RNG : NSObject
@property (assign) unsigned long seed;
- (unsigned long)random;
- (long)randomBetween: (long)min and: (long)max;
@end
Run Code Online (Sandbox Code Playgroud)
RNG.m:
#define A 16807 /* a relatively prime number -- also M div Q */
#define M 2147483647L /* 0xFFFFFFFF / 2 */
#define Q 127773L /* M div A */
#define R 2836 /* M mod A */
@implementation RNG
@synthesize seed = _seed;
- (id)init {
self = [super init];
if (self) {
self.seed = 0;
}
return self;
}
- (unsigned long)random {
self.seed = A * (self.seed % Q) - R * (self.seed / Q);
if (self.seed > M)
return (self.seed -= M);
else if (self.seed)
return (self.seed);
else
return (self.seed = 1L);
}
- (long)randomBetween: (long)min and: (long)max {
return ([self random] % (max - min + 1) + min);
}
- (void)seed: (unsigned long)new_seed {
if (new_seed == 0)
new_seed = 1;
while (new_seed > M)
new_seed -= M;
self.seed = new_seed;
}
@end
Run Code Online (Sandbox Code Playgroud)
这看起来像“线性同余生成器”,请参阅http://en.wikipedia.org/wiki/Linear_congruential_generator “?
这些没有提供良好的加密安全性,所以是的,应该可以计算产生序列的种子。