随机数组生成,没有重复

use*_*016 4 c c++ random

我正在尝试创建一些生成随机数组但没有重复值的东西.我已经看过其他答案,但似乎没有人帮助我理解.我想不出一种方法来实际生成不包含重复项的随机数.这是我到目前为止所尝试的:

srand(time(NULL));
int numbers [4];

for (int x=0; x!=4;x++)
{
    numbers[x] = 1 + (rand() % 4) ;
    printf("%d ", numbers[x]);
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Dar*_*ter 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.


rul*_*lof 6

首先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]);
    }
}
Run Code Online (Sandbox Code Playgroud)