【问题标题】:Random shuffle using vector使用向量随机洗牌
【发布时间】:2013-10-20 17:56:28
【问题描述】:

我正在尝试在数组中生成非重复索引 (0-51) 并在其中存储一些整数。 但是输出看起来很奇怪。以下是我的代码:

#include <iostream>     // std::cout
#include <algorithm>    // std::random_shuffle
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand

// random generator function:
int myrandom (int i)
{
    return std::rand()%i;
}

int main ()
{

  int* temp = new int[52];

  std::srand ( unsigned ( std::time(0) ) );
  std::vector<int> myvector;

  // set some values:
  for (int i=0; i<52; ++i) myvector.push_back(i);

  // using built-in random generator:
  std::random_shuffle ( myvector.begin(), myvector.end() );

  // using myrandom:
  std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);

  std::vector<int>::iterator it=myvector.begin();

  for(int i = 1;i<=24;i++)
  {
      temp[*it] = i;
      it++;

  }

  for(int i = 0;i<52;i++)
  {
      std::cout << temp[i];
      std::cout << '\n';
  }

  delete[]temp;
  temp = NULL;



  return 0;
}

这里出了什么问题?

输出包含非常大的数字,例如:1998373

【问题讨论】:

  • 对不起,我编辑了它。但它仍然不能产生正确的输出。
  • 你为什么只设置temp的24个元素?
  • 更重要的是,为什么只设置24,然后尝试打印出所有52?
  • @CareyGregory 因为我需要让 24 个元素随机分布在一个数组中,并将其余索引设置为 1。
  • @14K :您没有在代码中将剩余数组设置为 1。用std::fill(temp, temp+51, 1); 初始化temp,然后执行for 循环。

标签: c++ random vector shuffle


【解决方案1】:

new int[52] 返回未初始化的内存。您只设置了其中的 24 个值,其余的保持未初始化。也许是这样:

for(int i = 1;i<=24;i++)
{
  temp[*it] = i;
  it++;
}

本来就是

for(int i = 1;i<52;i++)
{
  temp[*it] = i;
  it++;
}

?或者在分配后将所有值显式设置为0

【讨论】:

  • @14K 然后将内存设置为0: for (int i=0; i&lt;52; ++i) temp[i]=0; 或类似的东西(在你分配tempnew 之后立即放置)。
  • @14K 那么你应该使用std::fill(temp, temp+51, 0);初始化你的temp东西
  • 嗯,我认为问题必须是,如果您只将 24 个元素复制到 temp,当您从 temp 输出 52 个元素时您期望看到什么,为什么要在 temp 中分配 52 个元素第一名?
  • @14K 如果您不初始化变量,它的值将只是一些垃圾值,这就是您所看到的。
  • @14K 我认为这不是原因。 Java 有一种为几乎所有事物定义行为的哲学。 C++ 允许很多东西是实现定义的,或者只是完全未定义的(比如未初始化变量的实际值)。这样可以提高效率,但代价是很难调试程序。在 Java 中,即使有 bug 的程序也有明确定义的行为,而在 C++ 中通常没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
相关资源
最近更新 更多