生成具有不同数字的整数数组,并且第一个数字不能为零
本文关键字:数字 第一个 不能 数组 整数 | 更新日期: 2023-09-27 18:15:41
我想创建一个包含四个整数的数组,如下所示:
- 情况不同
- 每个值在0到9之间
- 第一个必须不同于零
- 2542 ==>无效(两种情况值相同)
- 0259 ==>无效(零位)
- 1025 ==>有效
我试过这个片段:
int[] _current_number = new int[4];
Random randNum = new Random();
_current_number = Enumerable.Repeat(0, 4)
.Select(i => randNum.Next(0, 9))
.ToArray();
如何改进我的代码
Enumerable.Range(1000,8999)
.Where(x=>x.ToString().ToArray().Distinct().Count()==4)
.ToArray();
Random rng = new Random();
int[] numbers = Enumerable.Range(0, 10).OrderBy(x => rng.Next()).ToArray();
if (numbers[0] == 0) // If first is 0, swap with another random element.
{
int i = 1 + rng.Next(9);
numbers[0] = numbers[i];
numbers[i] = 0;
}
int[] result = numbers.Take(4).ToArray(); // Use the 4 numbers in result[]
操作如下:
- 创建一个0到9之间的所有数字序列。
- 将这些数字洗牌成数组
- 如果洗牌后的数字中的第一项为0,则将其与另一个随机元素交换。
- 从洗牌后的数字中取出前4项。
在我看来,这是最易读和最有效的方法:
Random r = new Random();
HashSet<int> nums = new HashSet<int>() { r.Next(1, 10) };// add the one with non-zero logic first
while (nums.Count < 4)
nums.Add(r.Next(0, 10));
int[] result = nums.ToArray();
LINQ不是这项工作的最佳工具,因为您根据索引有不同的逻辑,因为您需要不断检查重复。LINQ查询在执行之前并不"知道"它的状态。HashSet<T>
非常适合这个要求。
不完全是linq,而是另一种方法,从内存输入:)
List<int> numbers = new List<int>();
Random randNum = new Random();
var rand = randNum.Next(1, 9);
numbers.add(rand);
do
{
rand = randNum.Next(0, 9);
if(!numbers.contains(rand))
{
numbers.add(rand);
}
}
while (numbers.Count < 4);