[c#] 如何在C#中生成一个随机int数?



10 Answers

每次你做新的随机()它被初始化。 这意味着在一个紧密的循环中,您可以获得相同的价值。 您应该保留一个Random实例,并在同一个实例上继续使用Next。

//Function to get random number
private static readonly Random getrandom = new Random();

public static int GetRandomNumber(int min, int max)
{
    lock(getrandom) // synchronize
    {
        return getrandom.Next(min, max);
    }
}
Question

如何在C#中生成一个随机整数?




您可以在MiscUtil类库中使用Jon Skeet的StaticRandom方法,该类库为伪随机数构建。

using System;
using MiscUtil;

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine(StaticRandom.Next());
        }
    }
}



我想演示每次使用新随机发生器时会发生什么。 假设你有两个方法或两个类,每个方法都需要一个随机数。 你天真地编码他们就像:

public class A
{
    public A()
    {
        var rnd=new Random();
        ID=rnd.Next();
    }
    public int ID { get; private set; }
}
public class B
{
    public B()
    {
        var rnd=new Random();
        ID=rnd.Next();
    }
    public int ID { get; private set; }
}

你认为你会得到两个不同的ID?

class Program
{
    static void Main(string[] args)
    {
        A a=new A();
        B b=new B();

        int ida=a.ID, idb=b.ID;
        // ida = 1452879101
        // idb = 1452879101
    }
}

解决方案是始终使用一个静态随机生成器。 喜欢这个:

public static class Utils
{
    public static readonly Random random=new Random();
}

public class A
{
    public A()
    {
        ID=Utils.random.Next();
    }
    public int ID { get; private set; }
}
public class B
{
    public B()
    {
        ID=Utils.random.Next();
    }
    public int ID { get; private set; }
}



Random randomNumberGenerator = new Random ();
int randomNumber = randomNumberGenerator.Next (lowerBound,upperBound);



试试这些简单的步骤来创建随机数字:

创建功能

private int randomnumber(int min, int max)
{
    Random rnum = new Random();
    return rnum.Next(min, max);
}

在想要使用随机数的位置使用上述功能。 假设你想在文本框中使用它。

textBox1.Text = randomnumber(0, 999).ToString();

0分最小,999最大。 您可以将值更改为任何您想要的值。

另请查看此页面上的答案。

http://solutions.musanitech.com/c-how-to-create-random-numbers/




here修改答案。

如果您可以访问兼容英特尔安全密钥的CPU,则可以使用这些库生成真正的随机数字和字符串: https://github.com/JebteK/RdRandhttps://github.com/JebteK/RdRandhttps://www.rdrand.com/

只需从here下载最新版本,包括Jebtek.RdRand并为其添加使用声明。 那么,你需要做的就是:

bool isAvailable = RdRandom.GeneratorAvailable(); //Check to see if this is a compatible CPU
string key = RdRandom.GenerateKey(10); //Generate 10 random characters
string apiKey = RdRandom.GenerateAPIKey(); //Generate 64 random characters, useful for API keys
byte[] b = RdRandom.GenerateBytes(10); //Generate an array of 10 random bytes
uint i = RdRandom.GenerateUnsignedInt() //Generate a random unsigned int

如果您没有兼容的CPU来执行代码,只需使用rdrand.com上的RESTful服务即可。 使用项目中包含的RdRandom包装库,您只需要执行此操作(注册时可以获得1000个免费呼叫):

string ret = Randomizer.GenerateKey(<length>, "<key>");
uint ret = Randomizer.GenerateUInt("<key>");
byte[] ret = Randomizer.GenerateBytes(<length>, "<key>");



我使用下面的代码来获得一个随机数:

var random = new Random((int)DateTime.Now.Ticks);
var randomValue = random.Next(startValue, endValue + 1);



注意new Random()在当前时间戳上播种。

如果您只想生成一个数字,您可以使用:

new Random().Next( int.MinValue, int.MaxValue )

有关更多信息,请查看Random类,但请注意:

但是,由于时钟具有有限的分辨率,因此使用无参数构造函数来连续创建不同的随机对象会产生随机数发生器,这些随机数发生器会产生相同的随机数序列

所以不要使用这段代码来生成一系列随机数。




我想添加一个加密安全版本:

RNGCryptoServiceProvider类( MSDNdotnetperls

它实现了IDisposable。

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
   byte[] randomNumber = new byte[4];//4 for int32
   rng.GetBytes(randomNumber);
   int value = BitConverter.ToInt32(randomNumber, 0);
}



 int n = new Random().Next();

你也可以给Next()函数提供最小值和最大值。 喜欢

 int n = new Random().Next(5,10);



这是我使用的课程。 像RandomNumber.GenerateRandom(1, 666)

internal static class RandomNumber
{
    private static Random r = new Random();
    private static object l = new object();
    private static Random globalRandom = new Random();
    [ThreadStatic]
    private static Random localRandom;
    public static int GenerateNewRandom(int min, int max)
    {
        return new Random().Next(min, max);
    }
    public static int GenerateLockedRandom(int min, int max)
    {
        int result;
        lock (RandomNumber.l)
        {
            result = RandomNumber.r.Next(min, max);
        }
        return result;
    }
    public static int GenerateRandom(int min, int max)
    {
        Random random = RandomNumber.localRandom;
        if (random == null)
        {
            int seed;
            lock (RandomNumber.globalRandom)
            {
                seed = RandomNumber.globalRandom.Next();
            }
            random = (RandomNumber.localRandom = new Random(seed));
        }
        return random.Next(min, max);
    }
}





Related



Tags

c# c#   random