用唯一的 int 填充数组

Populating array with unique int

我有一个生成随机数的 Arduino 草图。我需要用 5 个唯一生成的数字填充一个数组。为了在 loop() 中执行此操作,我执行了以下操作:

  for (int i=0; i<5; i++){

number=mappedForNumber(50);

if (isUnique(number)==true){

 numbers[i]=number;

}

}

其中 number 是一个全局 int,numbers 是一个数组,也在草图顶部全局声明

“isUnique”函数如下:

bool isUnique (int foo){

  bool pepe=true;

   int sizeOfNumbers=sizeof(numbers)/sizeof(numbers[0]);
    
    for (int i=0; i<sizeOfNumbers; i++){

      if (numbers[i]==foo){

        pepe=false;
        break;
      }

    }

  
  return pepe;
  }

当我检查结果时,它确实不起作用。如果我生成 30 个数组并在串行监视器上打印它们,总会有一些数组有重复的数字。

好久没写代码了,超级生疏。任何帮助,将不胜感激。提前致谢!

我会使用截断的 Fisher-Yates 算法来执行此操作,假设您经常需要 select 一组五个数字。

给定一副标有 1 到 50 的“纸牌”,您洗牌并抽取前五张牌。随心所欲地使用它们。

但是,由于您只需要五个,因此您只需要洗牌“前五名”即可。这是 Fisher-Yates 的“截断”部分。从一副牌的末端向下迭代五张牌和该牌下方的 select 五张牌(包括那张牌)以与该牌交换。

然后当你还需要五个随机数时,再重新洗牌。

// swaps two integers
void swap(int& a, int& b) {
  int temp = a;
  a = b;
  b = temp;
}

// returns a pointer to an array of ints randomly
// selected between consecutive values in [1, 50]
// num_ints_requested must be <= the size of the deck
const int* ShuffleRandomInts(int num_ints_requested) {
  constexpr int kNumInts = 50;
  static bool initialized = false;
  static int deck[kNumInts];

  if (!initialized) {
    for (int i = 0; i < kNumInts; ++i) {
      deck[i] = i + 1;
    }
    initialized = true;
  }

  // do the truncated shuffle
  for (int i = kNumInts - 1; i >= kNumInts - num_ints_requested; --i) {
    int j = random(0, i);
    swap(deck[i], deck[j]);
  }

  return &deck[kNumInts - num_ints_requested];
}

void loop() {
  // do work
  ...

  // get 5 random numbers between 1 and 50
  // and do something with them
  const int* numbers = ShuffleRandomInts(5);
  DoSomethingWithFive(numbers);

  // get 10 random numbers between 1 and 50
  // (this invalidates the previously selected numbers)
  numbers = ShuffleRandomInts(10);
  DoSomethingWithTen(numbers);

  // do other stuff
  ...
}

如果您需要在生成另一组随机 selected 数字后使用一组随机 selected 数字,请在重新洗牌之前将这些数字复制到一个新数组中。

我们 return 一个指向 const int 的指针,这样您就不会在 return 编辑它之后不小心修改它。扩展洗牌的类比,这就像发五张牌给某人,然后让他们用记号笔在牌上画画,然后再把它们交还给你重新洗牌。你不希望这样,所以你指定在 returning 之后你不能修改这些数字。

(如果你需要修改它们,你必须将它们复制到一个非const int或非const int数组)。

您正在使用 for 循环来填充数字数组。 如果它是唯一的,这个 for 循环将用一个数字填充选定的索引,如果不是,则不会更改索引内的数据。
修复您的代码:

int i = 0;
int number;
while(i < 5)
{
  number = mappedForNumber(50);
  if (isUnique(number) == true)
  {
    numbers[i]=number;
    i++;
  }
}