生成具有不同数字的整数数组,并且第一个数字不能为零

本文关键字:数字 第一个 不能 数组 整数 | 更新日期: 2023-09-27 18:15:41

我想创建一个包含四个整数的数组,如下所示:

  1. 情况不同
  2. 每个值在0到9之间
  3. 第一个必须不同于零

  • 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[]

操作如下:

  1. 创建一个0到9之间的所有数字序列。
  2. 将这些数字洗牌成数组
  3. 如果洗牌后的数字中的第一项为0,则将其与另一个随机元素交换。
  4. 从洗牌后的数字中取出前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);