所以我要做的是创建一个包含5个元素的随机数组,这些元素应该填充1到6的数字,它们不会重复,我不知道我的逻辑错在哪里。
void genNumber(int vet[]){
int max, i, j, atual;
srand(time(NULL));
max = 7;
for (i=0;i<5;i++){
vet[i] = rand() % max;
while(vet[i] == 0){
vet[i] = rand() % max;
}
for(j=0;j<i;j++){
atual = vet[j];
while((vet[i] == atual)||(vet[i] == 0)){
vet[i] = rand() % max;
atual = vet[j];
}
}
}
}
更新:已修复
void genNumber(int vet[]){
int max, i, j;
srand(time(NULL));
max = 7;
for (i=0;i<5;i++){
vet[i] = rand() % (max-1) + 1;
for(j=0;j<i;j++){
while(vet[j] == vet[i]){
vet[i] = rand() % (max-1) + 1;
j = 0;
}
}
}
}
答案 0 :(得分:1)
逻辑缺陷是在找到重复时产生新随机数的方式。
想象一下,您已经拥有vel = {1,2,0,0,0,...}
,并且正在尝试为vel[2]
找到一个号码。如果您随机抽取2
,您就会发现它已经存在并再次绘制。但是如果你这次画了1
,你就不会注意到,因为你只是比较了看到的最后一个值,2
。所以你得到vel = {1,2,1,...}
。
&#34;解决方案&#34;:每次时间绘制一个新的随机数,您必须将其与列表中已有的所有数字进行比较。
解决这个问题的另一种方法是我试着在评论中概述的方法:你必须保留哪些数字对某个地方的抽奖仍然有效的信息。您可以使用&#34;输出&#34;你现在正在做的那个数组,或者你可以使用另一个商店,你可以从中删除&#34;一旦它被绘制的条目。
答案 1 :(得分:0)
生成随机数时,你必须检查它是否在数组中找到,所以迭代数组并检查。如果找到数字,生成另一个随机数并检查,直到找不到新的数字。分配它的数组。然后重复。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int check(int vet[],size_t size,int val);
void genNumber(int vet[],size_t size);
int main(void)
{
srand(time(NULL));
int vet[5];
size_t size = 5;
genNumber(vet,size);
for( size_t n = 0 ; n < size ; n++ )
{
printf("%d ",vet[n]);
}
}
void genNumber(int vet[],size_t size)
{
int num = rand() % 6 + 1;
vet[0] = num;
for( size_t n = 1 ; n < size ; n++ )
{
num = rand() % 6 + 1;
while( 1 )
{
if( check(vet,n,num) )
{
num = rand() % 6 + 1;
}
else
{
vet[n] = num;
break;
}
}
}
}
int check(int vet[],size_t size,int val)
{
for( size_t n = 0 ; n < size ; n++ )
{
if( vet[n] == val )
{
return 1;//FOUND
}
}
return 0;//NOT FOUND
}
答案 2 :(得分:0)
作为替代方案,您可以使用1到6的值填充数组。然后,您可以随机指示对数组进行随机播放。
#define MAX 6
void swap (int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void genNumber(int *vet) {
int i;
for(i=0;i<MAX;i++) {
vet[i] = i+1;
}
for(i = MAX-1;i > 0;i--) {
// Pick a random index from 0 to i
int j = rand() % (i+1);
// Swap vet[i] with the element at random index
swap(&vet[i], &vet[j]);
}
}
如果您打算多次拨打srand(time(NULL));
功能,也不应该在genNumber
内部呼叫int vet[MAX] = {0};
srand(time(NULL));
genNumber(vet);
for(i=0;i<5;i++) {
printf("after num %d\n", vet[i]);
}
,因为如果您拨打的话,它会给您相同的号码一秒一次。
然后只使用数组中的前五个元素。所以你可以从主
这样称呼它vimgrep