Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么样的随机数生成系统会为给定的密钥返回一个结果?_C#_C++_Random_Hash_Generator - Fatal编程技术网

C# 什么样的随机数生成系统会为给定的密钥返回一个结果?

C# 什么样的随机数生成系统会为给定的密钥返回一个结果?,c#,c++,random,hash,generator,C#,C++,Random,Hash,Generator,我正在寻找一个crossplarform标准随机数生成器,它在使用种子初始化后,总是为给定的整数键返回相同的随机数 在不生成任何类型的键/值映射的情况下,在这一点上,内存节约比处理器使用更为重要 假设我们用一个种子(不是键)初始化生成器 然后我们可以检索任意键的结果。每次调用都会为同一个键返回相同的结果 例如: KeyBasedRandomGenerator r1 = new KeyBasedRandomGenerator(MY_SEED); KeyBasedRandomGenerator r2

我正在寻找一个crossplarform标准随机数生成器,它在使用种子初始化后,总是为给定的整数键返回相同的随机数

在不生成任何类型的键/值映射的情况下,在这一点上,内存节约比处理器使用更为重要

假设我们用一个种子(不是键)初始化生成器

然后我们可以检索任意键的结果。每次调用都会为同一个键返回相同的结果

例如:

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);

编辑:我了解哈希的作用以及常用随机生成器的工作原理。我正在寻找的是一个标准化的随机数生成器函数或实现(库),它与键一起工作


如果在这种情况下没有比“哈希函数”更具体的术语,那么它就是哈希函数。

嗯,它们被称为“哈希函数”。钥匙不必只是一个数字。它可以是任何数据块。哈希函数对某些任意输入执行复杂的逐位计算,并为输出生成单个值。出于所有实际目的,生成的散列值将显示为随机值。

LCG对于给定的空间(例如64位)具有一组良好的参数,将为给定的输入/状态生成相同的RN

基本上,LCG将任何64位值唯一地映射到另一个64位值

另外,比如说,像AES这样的像样的密码将完全做到这一点——给定输入键,它将把它映射到输出值(比如,128位->128位)


链接:

当我读到这个问题时,我认为他问的不是哈希函数,而是PRNG。(我可能错了。)

伪随机数生成器——大多数计算机RNG都是PRNG——根据“种子”生成固定的数字序列

<> P>所有的C和C++ RNGS(除一个)均为PRNGs。


请参阅文档。

该.Net随机类有一个接受种子的构造函数。对于给定的种子(您称之为“给定整数键”),您应该得到相同的“随机”数作为回报。这样,它就像一个散列

    int seed = 101;
    Random r = new Random(seed);  //use same seed
    int rInt = r.Next(0, 100);    //can specify a range
    Console.WriteLine(rInt);

参考资料:

我不知道这些随机函数类的名称,但我相信Mersenne Twister(通常是MT19937)应该能够保证相同的结果,无论是平台还是实现


一般来说,不能保证任何给定的哈希或随机函数在不同的平台上返回相同的结果。这似乎是所讨论的算法的一个实现细节。

嗨,这可以在原型设计期间工作,但是是否有某种算法可以在不分配任何内存的情况下达到相同的效果?在调用随机数检索时,我必须避免任何内存分配。考虑到您总是希望为同一个键返回相同的值,您能否简单地为完整的有效键集创建键-值对的静态数据结构?这台电视机够小吗?你有足够的内存吗?创建哈希映射也不是最佳解决方案,因为在执行过程中可以检索不同的种子,然后会导致更高的分配。我认为所有这些随机生成器都可以返回一个随机数序列,但是,如果我尝试检索100000000个号码,然后检索9999999个号码呢?我需要一种算法,能够始终为给定的密钥生成相同的结果,而不必遍历前面的所有数字。您能否解释一下“如果我尝试检索100000000个数字,那么99999999个数字”这一问题与上述要求有何关系?为什么您对从psuedo随机序列中检索除第一个以外的任何数字感兴趣?当你说“不必通读前面的所有数字”时,这让我摸不着头脑。我相信我可以使用散列函数组合出一个解决方案,我想知道是否现有的通用/标准解决方案可以实现这一点。有多个标准散列函数。谷歌食品:MD5,SHA1,SHA256。我确信C语言有一个,我知道几个标准的密码库,它们在C和C++中实现这些散列函数,保证了两种语言中相同的结果,这是你所希望的特性之一。所以只要用源代码添加自己的PRNG,这样你就会知道结果是什么。“完美散列函数”——如果您的输入事先已知,则有工具生成它们。
    int seed = 101;
    Random r = new Random(seed);  //use same seed
    int rInt = r.Next(0, 100);    //can specify a range
    Console.WriteLine(rInt);