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