Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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#_.net_Random - Fatal编程技术网

C# 随机(整数种子)保证什么?

C# 随机(整数种子)保证什么?,c#,.net,random,C#,.net,Random,我正在做一个项目,它依赖于给用户分配一个更大集合的随机子集(没什么特别的,只是统一的)。每个用户都有一个与整数同构的集合中的唯一标识符。据我所知,有两种方法可以做到这一点 在用户和前面提到的较大集合的键控元素之间创建一个数据库连接表,每个用户使用一次函数。这对我的需求来说可能有点不切实际,所以我宁愿 在运行时,通过类似的函数确定子集,但使用唯一的用户id作为种子值,并在内存中设置。下次需要它时,它会从一个更大的集合中再次创建 所以我的问题是,如果我使用.NET随机对象创建第二个函数,使用用户id

我正在做一个项目,它依赖于给用户分配一个更大集合的随机子集(没什么特别的,只是统一的)。每个用户都有一个与整数同构的集合中的唯一标识符。据我所知,有两种方法可以做到这一点

  • 在用户和前面提到的较大集合的键控元素之间创建一个数据库连接表,每个用户使用一次函数。这对我的需求来说可能有点不切实际,所以我宁愿
  • 在运行时,通过类似的函数确定子集,但使用唯一的用户id作为种子值,并在内存中设置。下次需要它时,它会从一个更大的集合中再次创建
  • 所以我的问题是,如果我使用.NET随机对象创建第二个函数,使用用户id作为种子值,Microsoft是否保证将来不会更改随机算法?也就是说,所有机器上所有新随机(n)的Next()序列是否永远相同

    或者,我可以创建自己的随机生成器,并将其与代码打包。事实上,我可能会这么做,但我仍然很想知道答案。

    不,它是为了跨版本兼容:

    random类中随机数生成器的实现不能保证在.NET Framework的主要版本中保持不变。因此,应用程序代码不应假定相同的种子将在不同版本的.NET Framework中产生相同的伪随机序列

    Microsoft as代码改进会针对已识别的漏洞、问题或缺陷进行,但到目前为止,代码并未更改,如果您不更改框架,您应该始终具有相同的功能


    所以,就当它不会改变。。。但是,当您决定升级框架时,请确保它仍能正常工作。

    您可以使用非常大的素数来生成一个看起来非常随机的数字序列,并且它始终是相同的序列:

    p=Verylarge素数 q=小于p的任何数字(但不能太小)

    迭代是这样的:

    n=(n*q)%p

    首先是种子

    也许某些加密方法更适合。。。 也就是说,每次迭代都会对种子位进行签名, 在下一次迭代中,你对上一个签名进行签名,
    依此类推。

    假设上下文保持不变(即,底层代码不变),则使用固定值n对伪随机数生成器进行种子设定应使生成器每次生成完全相同的伪随机序列

    供应商(在本例中为Microsoft)可以保证PRSG的实施不会改变。然而,他们没有:为什么他们应该这样做?他们认为PRNG的点类似于熵的产生


    如果您使用PRNG生成可重复的唯一标识符,那么您找错了方向。

    在发布之前,我浏览了同一篇MSDN文章,但什么也没找到!男孩让我脸红了。:)好的,非常感谢你指出这一点。尽管如此,我不会听从你的建议,因为我更喜欢编码并忘记——我将实现我自己的统一随机整数生成器。应该不会太难。嗯,这就是我的意思。如果我实现我自己的随机,它可能只会工作,直到我们的猴子霸主改变整数的含义。相信神圣整数类型。它是。。。所以整数+这是我第一次想到要做的。简单高效。但是我发现了一个不稳定的MT19937实现,在对它进行了一些修补之后。。。嗯,坦率地说,这似乎奏效了。虽然我最终可能会使用你建议的更简单的方法,但我最终使用了n=((n*1103515245)+12345)&0x7fffffff;这非常适合我的需要,而且速度非常快。:)我不同意。首先,这并不意味着“类似于熵产生的东西”应该被允许或不允许改变。其次,假设实现不变,那么使用随机数生成器生成可预测序列是公平的。我解释了我的问题——我本来打算使用一个随机生成器,为什么不重新使用它而不是存储结果呢?冯·诺依曼就是这么做的!实际上,阅读起来很有趣=>