对于给定的密钥,哪些随机数生成系统会 return 恰好产生一个结果?
What random number generation systems would return exactly one result for a given key?
我正在寻找一个 crossplarform 标准随机数生成器 - 在用种子初始化后 - 对于给定的整数键总是 returns 相同的随机数 number .
并且这不会生成任何类型的 key/value 映射,在这一点上,内存保护比处理器使用更重要。
假设我们用种子(不是密钥)初始化生成器。
然后我们可以检索任意键的结果。对于相同的键,每次调用总是 return 相同的结果。
例如:
KeyBasedRandomGenerator r1 = new KeyBasedRandomGenerator(MY_SEED);
KeyBasedRandomGenerator r2 = new KeyBasedRandomGenerator(MY_SEED);
int test = r1.Get(500);
for (int key = 0; key < 10000000; ++key)
{
assert ( r1.Get(key) == r2.Get(key));
}
assert ( r1.Get(500) == test);
是否有适用于 C# 和 C++ 的实现?他们叫什么?
是否有可能找到始终 return 相同结果的变体:
assert ( r.Get(key, 0, 15) == r.Get(key, 0, 15));
编辑:我了解哈希的作用以及通常的随机生成器的工作原理。我正在寻找的是与密钥一起使用的标准化随机数生成器函数或实现(库)。
如果对于这种情况没有比 "hash function" 更具体的术语,那么将其散列。
嗯,他们叫 "hash functions"。密钥不必只是一个数字。它可以是任何数据块。哈希函数对某个任意输入执行复杂的逐位计算,并为输出生成单个值。出于所有实际目的,生成的哈希值将随机出现。
LCG,对于给定的 space(例如,64 位)具有一组好的参数,将为给定的 input/state.
生成相同的 RN
基本上,LCG 会将任何 64 位值唯一地映射到另一个 64 位值。
另外,比如说,像 AES 这样的体面的密码将完全做到这一点——给定输入密钥,它将把它映射到输出值(比如,128 位 -> 128 位)
Link: http://www.atmel.com/zh/cn/Images/article_random_number.pdf
当我读到这个问题时,我认为他问的不是哈希函数,而是 PRNG。 (我可能是错的。)
伪随机数生成器——大多数计算机 RNG 都是 PRNG——根据 "seed".
生成固定的数字序列
所有 C 和 C++ RNG(除了一个)都是 PRNG。
请参阅 <random> 文档。
.Net Random class 有一个接受种子的构造函数。对于给定的种子(你称之为 "given integer key"),你应该在 return 中得到相同的 "random" 数字。这样它就像一个散列。
int seed = 101;
Random r = new Random(seed); //use same seed
int rInt = r.Next(0, 100); //can specify a range
Console.WriteLine(rInt);
参考:https://msdn.microsoft.com/en-us/library/system.random(v=vs.110).aspx#Same
我不知道那些 class 随机函数的名称,但我相信 Mersenne Twister(通常是 MT19937)应该保证无论平台或实现如何都得到相同的结果。
一般来说,不能保证任何给定的散列函数或随机函数在不同平台上都会 return 产生相同的结果。这似乎是相关算法的实现细节。
我正在寻找一个 crossplarform 标准随机数生成器 - 在用种子初始化后 - 对于给定的整数键总是 returns 相同的随机数 number .
并且这不会生成任何类型的 key/value 映射,在这一点上,内存保护比处理器使用更重要。
假设我们用种子(不是密钥)初始化生成器。
然后我们可以检索任意键的结果。对于相同的键,每次调用总是 return 相同的结果。
例如:
KeyBasedRandomGenerator r1 = new KeyBasedRandomGenerator(MY_SEED);
KeyBasedRandomGenerator r2 = new KeyBasedRandomGenerator(MY_SEED);
int test = r1.Get(500);
for (int key = 0; key < 10000000; ++key)
{
assert ( r1.Get(key) == r2.Get(key));
}
assert ( r1.Get(500) == test);
是否有适用于 C# 和 C++ 的实现?他们叫什么?
是否有可能找到始终 return 相同结果的变体:
assert ( r.Get(key, 0, 15) == r.Get(key, 0, 15));
编辑:我了解哈希的作用以及通常的随机生成器的工作原理。我正在寻找的是与密钥一起使用的标准化随机数生成器函数或实现(库)。
如果对于这种情况没有比 "hash function" 更具体的术语,那么将其散列。
嗯,他们叫 "hash functions"。密钥不必只是一个数字。它可以是任何数据块。哈希函数对某个任意输入执行复杂的逐位计算,并为输出生成单个值。出于所有实际目的,生成的哈希值将随机出现。
LCG,对于给定的 space(例如,64 位)具有一组好的参数,将为给定的 input/state.
生成相同的 RN基本上,LCG 会将任何 64 位值唯一地映射到另一个 64 位值。
另外,比如说,像 AES 这样的体面的密码将完全做到这一点——给定输入密钥,它将把它映射到输出值(比如,128 位 -> 128 位)
Link: http://www.atmel.com/zh/cn/Images/article_random_number.pdf
当我读到这个问题时,我认为他问的不是哈希函数,而是 PRNG。 (我可能是错的。)
伪随机数生成器——大多数计算机 RNG 都是 PRNG——根据 "seed".
生成固定的数字序列所有 C 和 C++ RNG(除了一个)都是 PRNG。
请参阅 <random> 文档。
.Net Random class 有一个接受种子的构造函数。对于给定的种子(你称之为 "given integer key"),你应该在 return 中得到相同的 "random" 数字。这样它就像一个散列。
int seed = 101;
Random r = new Random(seed); //use same seed
int rInt = r.Next(0, 100); //can specify a range
Console.WriteLine(rInt);
参考:https://msdn.microsoft.com/en-us/library/system.random(v=vs.110).aspx#Same
我不知道那些 class 随机函数的名称,但我相信 Mersenne Twister(通常是 MT19937)应该保证无论平台或实现如何都得到相同的结果。
一般来说,不能保证任何给定的散列函数或随机函数在不同平台上都会 return 产生相同的结果。这似乎是相关算法的实现细节。