我想生成9个随机数,但我不想两次生成相同的数字。有一个简单的方法吗?
我想创建0到10之间的数字,以获得数字1,2,3,4,5,6,7,8,9。我将把这些数字放在一个数组中,如果我得到两次相同的数字,代码将不起作用,并且每次启动程序时它们都必须是随机的,不同的数字。
答案 0 :(得分:1)
只需继续生成新数字并将其与之前生成的数字进行比较
答案 1 :(得分:1)
使用shuffle bag。
我发现它比检查旧数字更清晰,理论上可能永远循环。
答案 2 :(得分:1)
只要范围远远大于您需要的项目数量,您就可以毫不费力地在丢弃重复项目时继续生成项目,直到您拥有所需数量的项目为止。
伪代码:
如果范围很小,并且您需要的项目数量占很大比例(例如1-10中的9个数字),您可能更愿意使用shuffle bag。
伪代码:
答案 3 :(得分:1)
Fisher-Yates Shuffle是另一个很好的解决方案:
Random _random = new Random();
public static void Shuffle<T>(T[] array)
{
var random = _random;
for (int i = array.Length; i > 1; i--)
{
// Pick random element to swap.
int j = random.Next(i); // 0 <= j <= i-1
// Swap.
T tmp = array[j];
array[j] = array[i - 1];
array[i - 1] = tmp;
}
}
并称之为:
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Shuffle(array);
此方法将原始数组混合到位,但可以轻松修改它以便返回不同的对象。没有比较所需的“以前的价值”。在你的情况下,它只迭代8次。
答案 4 :(得分:0)
using System;
using System.Linq;
namespace Test {
class Program {
static void Main(string[] args) {
var random = new Random();
int[] sequence = new int[9];
do {
for (var i = 0; i < sequence.Length; i++) {
sequence[i] = random.Next();
}
} while (sequence.Distinct().Count() != sequence.Length);
}
}
}
答案 5 :(得分:0)
int[] numbers = (
from number in Enumerable.Range(0, 10)
orderby Guid.NewGuid()
select number)
.ToArray();
答案 6 :(得分:0)
Random r = new Random();
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> result = new List<int>();
while (numbers.Count() > 0)
{
int pos = r.Next(0, numbers.Count() - 1);
result.Add(numbers[pos]);
numbers.RemoveAt(pos);
}
答案 7 :(得分:0)
对10个数字使用循环并使用,int r = arc4random()%numbers;其中number是生成,存储和使用这些数字的范围。我希望它可以帮助您更好地了解您的需求。
答案 8 :(得分:0)
这会在0到10之间生成6个随机整数(不包括):
int[] numbers = Enumerable.Range(0, 10)
.OrderBy(i => Guid.NewGuid())
.Take(6)
.ToArray();