设计自定义随机类

时间:2009-10-20 20:51:29

标签: c# algorithm

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

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

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

由于

7 个答案:

答案 0 :(得分:4)

从集合中选择随机元素可以按如下方式完成。

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

除非你有充分的理由,否则不必编写自己的随机生成器。

答案 1 :(得分:3)

我给你的建议是不要做。无论你认为你不想使用内置库的原因是什么,我很确定你误解了一些东西。请回到绘图板。

上述所有建议在技术上都是准确的,但有点像给化学教科书给想要改进自己的油用于汽车的人。

答案 2 :(得分:2)

有很多pseudo-random number generators。它们不是真正随机的,但它们的质量不同,它们的统计和顺序属性以及它们适用的目的是有区别的。

这在很大程度上取决于“你需要它的随机性”。如果它只需要“随意看一个人”,简单的生成器就像这样:

rnd = seed; // some starting value 
rnd = (a * rnd + b)  % c;  // next value
...

对于精选的a,b和c这些发生器的值,可以进行简单的统计测试。这些you find here的详细讨论和常见值。


一种有趣的方法是收集尽可能多的“外部”数据 - 例如按键之间的时间,鼠标移动,磁盘读取持续时间等等 - 并使用累积随机性同时丢弃依赖性的算法。这在数学上是棘手的(IIRC不久前发生的一次关键攻击基于其中一种并不像想象的那样随意)。


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

答案 3 :(得分:0)

您需要使用种子,这是计算机本身提供的半随机种子。 也许使用非常精细的分辨率时间并在调用方法时使用最后几微秒。这应该是随机的,可以生成从00到99的任何内容,然后你可以从那里开始。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

.Net Framework中唯一真正的“密码强”随机数生成器在System.Cryptography.RandomNumberGenerator中 - 通过Reflector运行它看看有什么作用?看看你的问题,你需要知道集合的计数,否则你可能永远不会检索项目 - 你需要指定一个开始和结束值来绘制随机数 - 随机类最好用 - 通过Reflector弹出它

答案 6 :(得分:0)

好吧,我从来没有想过要实现这个,因为它似乎重新发明了轮子,但是你可以查看这篇维基百科文章,希望它可以帮助你做你想做的事情

Random Number Generator

相关问题