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

839

我有如下函数:

//Function to get random number
public 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数组的所有成员都具有相等的值。

为什么会这样呢?


27
使用 new Random().Next((int)0xFFFF, (int)0xFFFFFF) % 256); 并不能生成比 .Next(0, 256) 更好的“随机”数。 - bohdan_trotsenko
2
你可能会发现这个NuGet包很有用。它提供了一个静态的Rand.Next(int, int)方法,可以在不锁定或遇到种子重用问题的情况下静态访问随机值。 - ChaseMedallion
15个回答

-1

我使用这个:

int randomNumber = int.Parse(Guid.NewGuid().ToString().FirstOrDefault(Char.IsDigit).ToString().Replace("\0", "0"));

性能:在我的电脑上生成100万个随机数:711毫秒。

如果Guid不包含任何数字(我不知道是否可能),则结果将使用0。


-2
我使用Rnd()函数解决了这个问题:
Function RollD6() As UInteger
        RollD6 = (Math.Floor(6 * Rnd())) + 1
        Return RollD6
End Function

当表单加载时,我使用Randomize()方法来确保我不会在每次运行时得到相同的随机数序列。

2
这个问题是关于C#,而不是Visual Basic.NET。(虽然两者都是.NET语言,而且即使可以从C#访问VB函数,但并不是那么简单。) - Peter O.

-2
在Visual Basic中,这个可以工作(如果不能转换为C#,则DLL引用可能是一个解决方案):
Private Function GetRandomInt(ByVal Min As Integer, ByVal Max As Integer) As Integer
     Static Generator As System.Random = New System.Random()
     Return Generator.Next(Min, Max)
End Function

-3

有很多解决方案,这里提供一个:如果你只想要数字,请删除字母,方法接收一个随机数和结果长度。

public String GenerateRandom(Random oRandom, int iLongitudPin)
{
    String sCharacters = "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ123456789";
    int iLength = sCharacters.Length;
    char cCharacter;
    int iLongitudNuevaCadena = iLongitudPin; 
    String sRandomResult = "";
    for (int i = 0; i < iLongitudNuevaCadena; i++)
    {
        cCharacter = sCharacters[oRandom.Next(iLength)];
        sRandomResult += cCharacter.ToString();
    }
    return (sRandomResult);
}

1
基本问题仍然是相同的 - 你正在传递一个 Random 实例,但你仍然期望调用者创建一个共享实例。如果调用者每次都创建一个新实例,并且在时钟更改之前代码执行两次,那么你将得到相同的随机数。因此,这个答案仍然做出了可能是错误的假设。 - Savage
此外,拥有生成随机数的方法的整个意义在于封装——调用方法不必担心实现细节,只关心获取一个随机数。 - Savage

-5

始终获得正随机数。

 var nexnumber = Guid.NewGuid().GetHashCode();
        if (nexnumber < 0)
        {
            nexnumber *= -1;
        }

这段代码并没有使用Random对象,正如问题中所明显的那样,而GUID并不旨在成为技术上的随机数(如上所述)。 - bytedev

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