我正在尝试创建一些生成随机数组但没有重复值的东西.我已经看过其他答案,但似乎没有人帮助我理解.我想不出一种方法来实际生成不包含重复项的随机数.这是我到目前为止所尝试的:
srand(time(NULL)); int numbers [4]; for (int x=0; x!=4;x++) { numbers[x] = 1 + (rand() % 4) ; printf("%d ", numbers[x]); }
任何帮助将不胜感激.
Darklighter.. 17
您开始填充具有从中开始的连续元素的容器 0
std::iota(begin(vec), end(vec), 0);
然后你给自己一个像样的随机数发生器并正确播种
std::mt19937 rng(std::random_device{}());
最后你用rng来洗牌
std::shuffle(begin(vec), end(vec), rng);
住在coliru
在某些实现random_device
上无法正常工作(最明显的是在Windows上使用gcc),您必须使用替代种子,即当前时间→ chrono
.
您开始填充具有从中开始的连续元素的容器 0
std::iota(begin(vec), end(vec), 0);
然后你给自己一个像样的随机数发生器并正确播种
std::mt19937 rng(std::random_device{}());
最后你用rng来洗牌
std::shuffle(begin(vec), end(vec), rng);
住在coliru
在某些实现random_device
上无法正常工作(最明显的是在Windows上使用gcc),您必须使用替代种子,即当前时间→ chrono
.
首先rand()
是genratig随机数,但不是重复.
如果要生成没有重复的随机数组,则该rand()
方法根本不起作用.
假设您要生成一个包含1000个数字的数组.在最好的情况下,比方说您生成的第一个999号没有重复和最后想到做的是产生的最后一个数字.获得该数字的概率是1/1000,因此这几乎需要永远生成.实际上只有10个数字会造成很大麻烦.
最好的方法是通过产生增量(您的所有数字或严格单调序列)是洗牌它们.在这种情况下,将没有重复
以下是如何使用10个数字进行操作的示例.即使有1000个数字也能正常工作.
注:从Suffle功能JHON Leehey的答案.
#include <stdio.h> #include <stdlib.h> #include <time.h> void shuffle(int *arr, size_t n) { if (n > 1) { size_t i; srand(time(NULL)); for (i = 0; i < n - 1; i++) { size_t j = i + rand() / (RAND_MAX / (n - i) + 1); int t = arr[j]; arr[j] = arr[i]; arr[i] = t; } } } int main() { int i; int arr[10]; for (i=0; i<10; i++){ arr[i] = i; } shuffle(arr, 10); for (i=0; i<10; i++){ printf("%d ", arr[i]); } }