鉴于RNG算法和一系列数字,是否可以确定哪个种子会产生该系列?

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)

mga*_*ert 3

这看起来像“线性同余生成器”,请参阅http://en.wikipedia.org/wiki/Linear_congruential_generator “?

这些没有提供良好的加密安全性,所以是的,应该可以计算产生序列的种子。