C#更好的随机函数

3
我正在生成许多随机数,我需要一个好的函数来帮助我。但是这个函数并没有提供太大的帮助:
public static class Randomizer
{
    static Random random = new Random((int)DateTime.Now.Ticks);

    public static int RandomInteger(int minimum, int maximum)
    {
        return random.Next(minimum, maximum + 1);
    }

    public static double RandomDouble()
    {
        return random.NextDouble();
    }
}

当我使用这个类时,我的数字往往是相同的。你有什么简单的想法可以提高随机数生成器的性能吗?

谢谢, 伊万


9
侧记:使用 Environment.Ticks 替代 DateTime.Now.Ticks。或者,实际上,干脆不提供自定义种子。 - user541686
2
@Ivan:哦,这并不是为了有所区别。只是因为使用绝对时间来执行任何操作不是很好的做法(因为它取决于系统时间的更改方式),而且传递时间是不必要的,因为它在内部已经执行了。 - user541686
5
你是否在多个线程上调用了这个东西? - Eric Lippert
2
数字是否比随机预期更经常相同? - Eric Lippert
2
我们需要看到一些展示问题的代码。我怀疑问题出在将“对象具有属性的概率”转换为代码上。 - Tergiver
显示剩余12条评论
3个回答

12

1
再次点击链接。 :) (注意到“其他版本”下拉菜单了吗?) - user541686
使用 RandomNumberGenerator.Create 实例化它,然后每次调用实例上的 GetBytes 来填充一个字节数组。然后尝试使用 BitConverter 的方法将其转换为整数。 - user541686
正是由于更好的随机性,它才是“安全的”。 - user541686
1
不是你用错了,我只是想说原帖作者应该回答一些评论而不是接受这个答案。 - H H
2
@Henk:我同意——我认为问题出在其他地方。我回答了他的问题,但我不确定是否提供的解决方案真正解决了他的问题。 - user541686
显示剩余2条评论

0

看看 Jon Skeet 的 MiscUtil

有一个静态随机类,可以无问题地工作。

顺便问一下,你需要随机还是唯一的数字?


1
唯一明显的区别是为了线程安全而进行锁定,假设 OP 在单线程环境中(这是一个很大的假设),那么就不会有任何区别。 - David Waters

-3
你的数字相同的原因是每次调用类时都会创建一个新的随机数生成器,这意味着它将使用 DateTime.Now.Ticks 中相同的数字进行种子初始化。
你应该将其设置为非静态类。实例化一次,然后从对象中重复调用相同的函数。

由于类中的随机字段是静态的,因此它只被实例化一次。 - Jon Benedicto
他不会在每次调用时创建 new Random() -- 或者他编辑了问题。 - abatishchev
不是的 - static Random random 只被初始化一次 - 他在哪里重新创建它了呢? - BrokenGlass
在方法中使用True或者初始化"Random",代码如下:int randomInt = (new Random()).Next(min, max); - dampee
2
@dampee 应该只初始化一次,做你刚才建议的事情是一个常见的错误,在那种情况下,你会得到重复的数字。 - BrokenGlass
@BrokenGlass。我在您之前发表了评论。你是完全正确的!在MSDN上查找了一下。 (http://msdn.microsoft.com/en-us/library/system.random.aspx)引用:由于时钟具有有限的分辨率,因此使用无参数构造函数在短时间内创建不同的随机对象会创建产生相同随机数序列的随机数生成器。 - dampee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接