C# 设计自定义随机类

C# 设计自定义随机类,c#,algorithm,C#,Algorithm,我知道C有Random类,在LINQ中可能有几个类可以做到这一点,但是如果我要编写自己的代码,在不使用任何内置.NET对象的情况下从集合中随机选择一个项,那该怎么做呢 我似乎无法确定这需要的逻辑——我如何告诉系统何时停止迭代并随机选择当前值 编辑:这是一个假设性问题。这与生产编码无关。我只是好奇 谢谢您需要使用一个种子,这是计算机本身提供的半随机的东西。 可能使用非常精细的解析时间,并在调用方法时使用最后几微秒。这应该是足够随机的,可以生成从00到99的任何内容,然后您可以从那里开始。听起来您的

我知道C有Random类,在LINQ中可能有几个类可以做到这一点,但是如果我要编写自己的代码,在不使用任何内置.NET对象的情况下从集合中随机选择一个项,那该怎么做呢

我似乎无法确定这需要的逻辑——我如何告诉系统何时停止迭代并随机选择当前值

编辑:这是一个假设性问题。这与生产编码无关。我只是好奇


谢谢

您需要使用一个种子,这是计算机本身提供的半随机的东西。
可能使用非常精细的解析时间,并在调用方法时使用最后几微秒。这应该是足够随机的,可以生成从00到99的任何内容,然后您可以从那里开始。

听起来您的问题不在于计算随机数,而在于如何使用该随机数从列表中选择项目。假设您可以以某种方式创建一个随机数,您所需要做的就是将其用作列表索引器的参数

int index = customRandomGenerator.Next();
var selection = items[index];
假设必须遍历列表的前提是正确的,或者集合没有索引器,则可以执行以下操作:

int index = customRandomGenerator.Next();
Item selection = null;
for (int i = 0; i < items.Length; i++) 
{
  if (i == index)
  {
    selection = items[i];
    break;
  }
}

.Net Framework中唯一一个真正的加密强随机数生成器是System.Cryptography.RandomNumberGenerator中的随机数生成器-通过Reflector运行该生成器,查看它的功能是什么?考虑到您的问题,您需要知道集合的计数,否则您可能永远无法检索项目-您需要指定一个开始值和结束值以从中提取随机数-random类将最有效-通过Reflector将其弹出。

从集合中选择一个随机元素可以按如下操作

Random r = new Random();
int randomIndex = r.Next(0, myCollection.Size -1);
var randomCollectionItem = myCollection[randomIndex];

除非你有很好的理由,否则编写自己的随机生成器是没有必要的。

好吧,我从来没有想过自己实现它,因为这看起来像是重新发明轮子,但你可以看看这篇维基百科文章,希望它能帮你做你想做的事

有很多。它们并不是真正随机的,但它们具有不同的质量,区别在于它们的统计和序列特性以及它们的用途

这在很大程度上取决于你需要它的随机性。如果只需要在人看来是随机的,那么简单的生成器如下所示:

rnd = seed; // some starting value 
rnd = (a * rnd + b)  % c;  // next value
...
对于精心选择的a、b和C值,这些生成器适用于简单的统计测试。详细的讨论和这些问题的共同价值

一种有趣的方法是收集尽可能多的外部数据,如按键之间的时间、鼠标移动、磁盘读取的持续时间等,并使用一种在丢弃依赖性的同时累积随机性的算法。这在数学上是很棘手的,尽管不久前IIRC就出现了一次关键的攻击,基于其中一次攻击的随机性并没有想象的那么大


只有极少数特殊应用使用真正随机的外部硬件源——介于开放输入放大器和放射性衰变之间的任何东西

我给你的建议是不要这样做。不管你认为你不想使用内置库的原因是什么,我很确定你误解了什么。请回到绘图板上


上面所有的建议在技术上都是准确的,但有点像是给一个想自己提炼油用在汽车上的人一本化学教科书。

你为什么不想使用任何.NET对象呢?它们真的很有用这是完全没有必要的;C的Random类已经做过类似的事情了。如果你要编写这样的代码,然后将种子注入随机类,那么你的代码将是完全冗余的。我知道.NET有一个随机类,但他似乎在问如何编写自己的随机类。。。