用唯一的 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++;
}
}
我有一个生成随机数的 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++;
}
}