如何获得范围< 0; 9>范围内的4个唯一随机数?

时间:2010-11-09 00:35:57

标签: c#

我想获得范围< 0; 9>范围内的4个唯一随机浮点数。我怎么能这样做是否可以使用单个函数执行此操作,因此我不需要在循环中生成随机数?

5 个答案:

答案 0 :(得分:14)

var rng = new Random();
int first = rng.Next(10);
int second = rng.Next(10);
int third = rng.Next(10);
int fourth = rng.Next(10);

如果您需要四个不同的值,那么您可以执行以下操作...

var rng = new Random();
var values = Enumerable.Range(0, 10).OrderBy(x => rng.Next()).ToArray();
int first = values[0];
int second = values[1];
int third = values[2];
int fourth = values[3];

请注意,如果您需要生成多个数字,那么proper shuffle implementation将提供比OrderBy更好的性能:O(n)而不是O(n log n)。如果您只需要一些数字,那么OrderBy就可以了。

答案 1 :(得分:6)

我很抱歉,但我无法抗拒

http://xkcd.com/221/

按照这种精神,你可以做到

r1=2.7;
r2=6.9;
r3=4.2;
r4=8.1;

我发誓他们是随机的

答案 2 :(得分:2)

  

所以我不需要在循环中生成随机数?

由于您的范围非常有限,您可以在[0,9999]中生成一个数字并使用十进制数字提取。这可能会提高性能,但只是非常轻微。就个人而言,我只会使用一个循环。

int fourDigit = m_Random.Next(10000);
int first = fourDigit % 10; fourDigit /= 10;
int second = fourDigit % 10; fourDigit /= 10;
int third = fourDigit % 10; fourDigit /= 10;
int fourth = fourDigit;

原始海报澄清了这些数字应该是截然不同的。这实际上需要在代码中至少某处进行循环。但是,通过调整上述内容,我认为不需要多次调用Random

注意:如果熟悉随机数背后的数学的人会如此善于分析,我不确定这种增量技术是否没有偏见。感谢。

int fourDigit = m_Random.Next(10000);
int first = fourDigit % 10; fourDigit /= 10;
int second = fourDigit % 10; while (second == first) second = (second + 1) % 10; fourDigit /= 10;
int third = fourDigit % 10; while (third == first || third == second) third = (third + 1) % 10; fourDigit /= 10;
int fourth = fourDigit; while (fourth == first || fourth == second || fourth == third) fourth = (fourth + 1) % 10;

答案 3 :(得分:2)

这是我用来获取给定范围内的不同随机数的原因:

var random = new Random();

int take = 4;
int rangeMin = 0;
int rangeMax = 10;

var randomUniqueNumbers = Enumerable.Range(0, int.MaxValue)
    .Select(i => random.Next(rangeMin, rangeMax))
    .Distinct()
    .Take(Math.Min(take, rangeMax - rangeMin));

使用Enumerable.Range(0,int.MaxValue)的无限枚举会更好,但是这样做了。

答案 4 :(得分:0)

为什么不这样做:

    Enumerable.Range(0, 9)
              .OrderBy(x => Guid.NewGuid().GetHashCode())
              .Take(4)
              .ToArray();