我试图随机输出20个不同的数字,但它仍包含相同的数字。 这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main(){
int arr[20];
srand(time(NULL));
int temp;
temp=rand()%20;
int x=0;
while(x<20)
{
if(x==0)
{
arr[x]=temp;
x++;
}
else
{
for(int j=1;j<=x;j++)
{
do
{
temp=rand()%20;
} while(temp==arr[x-j]);
}
arr[x]=temp;
x++;
}
}
for(int i=0;i<20;i++)
{
printf("%d. %d \n",i,arr[i]);
}
}
这是输出:
- 10
- 1
- 6
- 2&lt; - 重复
- 13
- 19
- 2&lt; -
- 19
- 4
- 19
- 14
- 18
- 12
- 2&lt; -
- 17
- 15
- 0
- 1
- 18
- 8
醇>
提前致谢:D
答案 0 :(得分:3)
#include <vector>
#include <algorithm>
...
vector<int> vec;
for (int i=0; i < 20; ++i) vec.push_back(i);
random_shuffle(vec.begin(), vec.end());
答案 1 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main(){
int arr[20];
srand(time(NULL));
int temp;
temp=rand()%20;
int x=0;
while(x<20)
{
if(x==0)
{
arr[x]=temp;
x++;
}
else
{
int j;
do
{
temp=rand()%20;
for(j=0;j<x;j++)
{
if ( temp==arr[j] ) break;
}
} while ( j < x );
arr[x]=temp;
x++;
}
}
for(int i=0;i<20;i++)
{
printf("%d. %d \n",i,arr[i]);
}
}
答案 2 :(得分:0)
想想你的循环
for(int j=1;j<=x;j++)
{
do
{
temp=rand()%20;
}while(temp==arr[x-j]);
}
以x = 8时的位置为例。这将循环通过j = 1到j = 7。它将继续生成一个数字,直到它与正在检查数组的当前数字不同,直到达到数组的开始。但是,请考虑何时达到j = 7。生成新数字时,它可能与数组中的第一个元素不同,因此将退出do-while循环;但是,它可能仍然与数组中的其他数字相同?
您需要(对于每个元素):生成一个随机数。检查它是否与数组中的任何数字都不匹配。如果它再次启动,如果它没有设置阵列号并继续。
答案 3 :(得分:0)
您可以准备std::vector
在您所需的范围内存储唯一号码,然后使用std::shuffle()
对其进行随机播放。
请注意rand()
is considered harmful,因此您可能希望使用更好的伪随机数生成器,例如Marsenne Twister引擎std::mt19937
。
Compilable评论代码如下:
#include <algorithm> // for std::shuffle
#include <iostream> // for std::cout
#include <random> // for std::mt19937, std::random_device
#include <vector> // for std::vector
using namespace std;
vector<int> PrepareUniqueRandomNumbers(const int count)
{
// Prepare the vector with unique numbers 0,1,2,...,(count-1)
vector<int> numbers;
numbers.reserve(count);
for (int i = 0; i < count; ++i)
numbers.push_back(i);
// Use Mersenne Twister engine as pseudo-random number generator
random_device rd;
mt19937 prng(rd());
// Shuffle the vector, so the numbers
// appear in a (pseudo-)random order.
shuffle(numbers.begin(), numbers.end(), prng);
return numbers;
}
int main()
{
const auto numbers = PrepareUniqueRandomNumbers(20);
for (auto x : numbers)
cout << x << '\n';
}
答案 4 :(得分:0)
如果您已经知道只存储20个数字,则无需使用矢量。 rand()函数已经过时,并不是很好的C ++风格。您也不需要Mersenne-Twister作为您的意图的引擎,这绝对没有必要。
#include <array>
#include <random>
#include <algorithm>
int main()
{
std::array<int, 20> randomNumbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
std::random_device randomDevice;
std::default_random_engine engine(randomDevice());
std::shuffle(randomNumbers.begin(), randomNumbers.end(), engine);
}