【问题标题】:Printing an an array of integers in random order without repeating in C++以随机顺序打印整数数组而不在 C++ 中重复
【发布时间】:2017-09-19 14:07:53
【问题描述】:

我正在尝试实现 printRandom() 函数,该函数应该重复地从数组 C 中选择和删除一个随机条目,然后打印出所选值,直到数组 C 中的所有值都被打印出来。它们每个只能打印一次。

我只能使用 cstdlib 和 iostream。到目前为止,这是我的函数代码:

void printRandom(int C[], int n, int seed) {
srand(seed);
int test[10] = { 21,-34,2,-42,89,24,11,4,13,-18 };

for (int i = 0; i < 10; i++)
{
    int r = rand() % 10;
    for (int j = 0; j < 10; j++) {
        if (r != C[j]) {
            C[i] = test[r];
            cout << C[i] << ' ';
        }
    }

}
}

这是我正在使用的主要功能:

int main() {
  int A[10], B[10] ;

  A[0] =  21 ;
  A[1] = -34 ;
  A[2] =   2 ;
  A[3] = -42 ;
  A[4] =  89 ;
  A[5] =  24 ;
  A[6] =  11 ;
  A[7] =   4 ;
  A[8] =  13 ;
  A[9] = -18 ;

  for (int i=0 ; i < 10 ; i++) {
     B[i] = A[i] ;
  }
  printRandom(B,10,38173410) ;

  for (int i=0 ; i < 10 ; i++) {
    B[i] = A[i] ;
 }
  printRandom(B,10,83103131) ;

 for (int i=0 ; i < 10 ; i++) {
    B[i] = A[i] ;
 }
  printRandom(B,10,77192102) ;

return 0 ;
}

现在我收到一大堆数字

-34 -34 -34 -34 -34 -34 -34 -34 -34 -34 24 24 24 24 24 24 24 24 24 24 13 13 13 13 13 13 13 13 13 13 89 89 89 89 89 89 89 89 89 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 2 2 2 2 2 2 2 2 2 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 4 4 4 4 4 4 4 4 4 4 13 13 13 13 13 13 13 13 13 13 -18 -18 -18 -18 -18 -18 -18 -18 -18 -18 -34 -34 -34 -34 -34 -34 -34 -34 -34 -34 2 2 2 2 2 2 2 2 2 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 4 4 4 4 4 4 4 4 4 4 11 11 11 11 11 11 11 11 11 11 -34 -34 -34 -34 -34 -34 -34 -34 -34 -34 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 21 21 21 21 21 21 21 21 21 21 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 13 13 13 13 13 13 13 13 13 13 -34 -34 -34 -34 -34 -34 -34 -34 -34 -34 89 89 89 89 89 89 89 89 89 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 13 13 13 13 13 13 13 13 13 13 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 13 13 13 13 13 13 13 13 13 13 89 89 89 89 89 89 89 89 89 89 13 13 13 13 13 13 13 13 13 13

我从 C++ 中抽离了一段时间,想知道您是否可以帮助或至少为我指明正确的方向。 谢谢!

【问题讨论】:

  • 我想你想要一个Fisher-Yates shuffle
  • 你可以使用std::random_shuffle
  • @tobi303:是的,除了“我只能使用 cstdlib 和 iostream。”
  • 这个测试,if (r != C[j]),没有任何意义。 r 是一个索引,但您将它与数组中的值进行比较。
  • @tobi303 请注意 std::random_shuffle 目前已弃用,将在 C++17 中删除。 std::shuffle 是更好的选择。

标签: c++ arrays function random srand


【解决方案1】:

除了可能的错误之外,您的方法效率相当低,例如,您多次滚动随机数以找到最后一个丢失的元素,而这实际上根本不需要掷骰子。

如果您跟踪已使用的索引,则可以避免这种“重新滚动直到索引有效”。在伪代码中:

void printRandom(int C[], int n, int seed) { 

     D = C;
     size = n;

     for i = 1:n {
          x = rand(  [0... size)  );

          print element at D[x]

          D[x] = D[size-1];

          size--;
     }
}

【讨论】:

    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2010-10-05
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多