随机数生成器只生成一个随机数

有以下函数:

//Function to get random numberpublic static int RandomNumber(int min, int max){
    Random random = new Random();
    return random.Next(min, max);}

不知道怎么描述:

byte[] mac = new byte[6];for (int x = 0; x < 6; ++x)
    mac[x] = (byte)(Misc.RandomNumber((int)0xFFFF, (int)0xFFFFFF) % 256);

如果在运行时使用调试器单步执行该循环,则会得到不同的值(这正是我想要的)。 但是,如果将断点放在该代码之下两行,则“ mac”数组的所有成员的值都相等。
为什么会这样?

5个回答

这个不是python呀……

但问题肯定出在两点:
1. seed种子的问题,如果是拿时间作为seed,时间间隔太短,数组里的数字肯定是一样的
2. 这种问题的种子问题不应该你自己解决,去查查api,一定是有专门生成某个区间内n个数的随机数的函数

每次你做新的 new Random()时,它都会使用时钟进行初始化。这意味着在一个严格的循环中,您可以多次得到相同的值。您应该保持一个 Random ,并在同一个上继续使用 Next。

//Function to get a random number private static readonly Random random = new Random(); private static readonly object syncLock = new object(); public static int RandomNumber(int min, int max){
    lock(syncLock) { // synchronize
        return random.Next(min, max);
    }}

为什么这儿需要lock?
基本上,Next 将更改 Random 实例的内部状态。 如果我们同时在多个线程中这样做,你可能会说“我们只是让结果变得更随机了” ,但实际上我们所做的可能会破坏内部实现,我们也可能开始从不同的线程获得相同的数字,这可能是一个问题,也可能不是。 但是,内部发生的情况的保证是更大的问题; 因为 Random 并不能保证线程安全。 因此,有两种有效的方法:
• 同步,这样我们就不会同时从不同的线程访问它
使用不同的Random
lock 实现了这些方法中的第一种(也是更简单的) ; 然而,另一种方法可能是:
private static readonly ThreadLocal appRandom
= new ThreadLocal(() => new Random());
这是针对每个线程的,所以你不需要同步。

为了便于在整个应用程序中重用,static类可能会有用。

public static class StaticRandom{
    private static int seed;
    private static ThreadLocal<Random> threadLocal = new ThreadLocal<Random>
        (() => new Random(Interlocked.Increment(ref seed)));
    static StaticRandom()
    {
        seed = Environment.TickCount;
    }
    public static Random Instance { get { return threadLocal.Value; } }}

然后可以使用static 随机实例和代码,如

StaticRandom.Instance.Next(1, 100);

可以通过使用特定于线程的存储模式来避免同步:

public class RandomNumber : IRandomNumber{
    private static readonly Random Global = new Random();
    [ThreadStatic] private static Random _local;
    public int Next(int max)
    {
        var localBuffer = _local;
        if (localBuffer == null) 
        {
            int seed;
            lock(Global) seed = Global.Next();
            localBuffer = new Random(seed);
            _local = localBuffer;
        }
        return localBuffer.Next(max);
    }}

正确的解决方案:

namespace mySpace{
    public static class Util
    {
        private static rnd = new Random();
        public static int GetRandom()
        {
            return rnd.Next();
        }
    }}

所以:

var i = Util.GetRandom();

也可以依赖 Guid。

public static class Util{
    public static int GetRandom()
    {
        return Guid.NewGuid().GetHashCode();
    }}

它会稍微慢一点,但是可以比Random.Next更随机。 接下来
但不是:

new Random(Guid.NewGuid().GetHashCode()).Next();

不必要的对象创建会使它变慢,特别是在循环下。
永远别这样:

new Random().Next();

它不仅速度较慢(在一个循环中) ,而且它的随机性...... 并不是很好。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问