【问题标题】:Randomly shuffle C++ array (different each time)随机洗牌 C++ 数组(每次不同)
【发布时间】:2015-01-03 09:30:50
【问题描述】:

我想在 C++ 中洗牌一个数组,每次程序运行时,我都想进行不同的随机洗牌。我有myArray 的长度。目前我正在使用:

random_shuffle(myArray, myArray+N)

但这每次都会产生相同的改组。为了包含一个随机数,我尝试了:

random_shuffle(myArray, myArray+N, rand()%i)

但我收到错误cannot convert parameter 3 from 'int' to 'int&'

我考虑使用基于this exampleshuffle 函数,但似乎我无法使用2011 年之前的编译器。

对不起,如果这是一个非常愚蠢的问题。我在 SO 上找不到这个特定问题的任何内容,谷歌只是告诉我创建洗牌算法的方法。

【问题讨论】:

  • 没有愚蠢的问题,只有问题。有一段时间我什至不能走路。
  • This link 是非常好的参考。请看一下
  • rand()%i 的类型不是函数也不是可调用对象,请仔细看看那个例子

标签: c++ arrays random shuffle


【解决方案1】:

random_shuffle(myArray, myArray+N) 将使用std::rand() 来获取随机数。如果您希望每次运行程序时随机序列都不同,您需要首先使用std::srand() 为随机生成器播种。使用当前系统时间来播种随机数生成器是很常见的,这对于非安全相关的目的通常已经足够了。您只需在程序执行期间执行一次。

std::srand(std::time(0));

如果您在第一次调用 std::rand() 之前没有调用 std::srand(),那么 std::rand() 的行为就像您调用了 std::srand(1) 一样——也就是说,每次程序运行,每次执行程序都会产生相同的随机序列。

【讨论】:

  • 补充一点:您通常只需要在程序中调用一次std::srand()
  • @moooeeeep 好点。我已将其纳入我的答案中。
猜你喜欢
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
相关资源
最近更新 更多