我正在尝试创建一些生成随机数组但没有重复值的东西.我已经看过其他答案,但似乎没有人帮助我理解.我想不出一种方法来实际生成不包含重复项的随机数.这是我到目前为止所尝试的:
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)
任何帮助将不胜感激.
首先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)
| 归档时间: |
|
| 查看次数: |
35520 次 |
| 最近记录: |