使用C#产生范围内的随机数


Answers:


418

你可以试试

Random r = new Random();
int rInt = r.Next(0, 100); //for ints
int range = 100;
double rDouble = r.NextDouble()* range; //for doubles

看一下

随机类Random.Next方法(Int32,Int32)Random.NextDouble方法


30
只是要添加一个注释,如果您使用的是NextDouble(),并且不希望下限为零。乘以上限和下限之间的差,然后将下限和零之间的差相加。因此,对于-1比1 double rDouble = (r.NextDouble()*2)-1.0;
Tom Heard

2
或在-1.0到1.0范围内的简化double生成器:Double randDoubleY = new Random()。Next(-100,100)/ 100.0D;
BoiseBaked

1
Random()使用时间相关的种子,但是将其明确写出对于可读性更好。
Evgeni Sergeev

44

尝试下面的代码。

Random rnd = new Random();
int month = rnd.Next(1, 13); // creates a number between 1 and 12
int dice = rnd.Next(1, 7); // creates a number between 1 and 6
int card = rnd.Next(52); // creates a number between 0 and 51

34

就像是:

var rnd = new Random(DateTime.Now.Millisecond);
int ticks = rnd.Next(0, 3000);

2
为了什么DateTime.Now.Millisecond
希尔,

1
你需要把东西给它下手......随机对象只是做你给的值很多的数学,并在某种程度上下一个()的每次调用这样做相同的随机对象将导致的值与上次调用非常随机。为了使结果在不同的Random对象之间更加随机,请从不同的数字开始-这里是DateTime.Now.Millisecond。如果您输入一个常数而不是一个变化的值,则将从.Next()获得相同的结果。
Mike M

12
Random已经使用系统值作为种子,并且Millisecond仅是0到999之间的数字。如果这对行在代码中始终在一起,则rnd.Next由于每次都会重置种子,因此将只有1000个可能的值。相同的种子输入,相同的随机数输出。我将手动种子排除在外。
John McDonald

@JohnMcDonald,您是正确的。确切地说,它是使用初始化的Environment.TickCount
Parag Meshram




3

这是Darrelk Answer的更新版本。它是使用C#扩展方法实现的。每次调用此方法时,它不会分配内存new Random())。

public static class RandomExtensionMethods
{
    public static double NextDoubleRange(this System.Random random, double minNumber, double maxNumber)
    {
        return random.NextDouble() * (maxNumber - minNumber) + minNumber;
    }
}

用法(确保导入包含RandomExtensionMethods类的名称空间):

var random = new System.Random();
double rx = random.NextDoubleRange(0.0, 1.0);
double ry = random.NextDoubleRange(0.0f, 1.0f);
double vx = random.NextDoubleRange(-0.005f, 0.005f);
double vy = random.NextDoubleRange(-0.005f, 0.005f);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.