生成k个小于n的互不相同的随机数出错

guocai_yao 2010-11-10 05:13:02
环境:windows xp, vc6.0


#include <stdio.h>
#include <stdlib.h>
#include<time.h>

#define N 20
#define K 10

void swap(int *a, int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}

void generateDiffRandV1(int a[], int n, int k)
{
int i;
time_t t;

for (i = 0; i < n; i++){
a[i] = i;
}

srand((int)time(&t));
for (i = 0; i < k; i++){
swap(&a[i], &a[i+rand()%(n-i)]);
}
}

int main()
{
int a[N];
generateDiffRandV1(a, N, K);
printArray(a, K);

return 0;
}


为什么generateDiffRandV1()函数生成的随机数当中会有同时出现两个'0'?
...全文
165 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycsdu 2012-05-22
  • 打赏
  • 举报
回复
问题不完全在于swap函数,调用swap函数时就有问题。
swap(&a[i], &a[i+rand()%(n-i)]);
为了保证相互交换过的数字不会再交换回来,参与交换的下标除了i,另外一个应该不能小于i的,这里可以直接用i+1+rand()%(n-i),这样就好了。不知道我理解的对不对?欢迎指正。
另外,使用异或的方式交换两个变量,必然有存储器别名的问题;还不如直接用一个临时变量!
guocai_yao 2010-11-10
  • 打赏
  • 举报
回复
哦,知道了,多谢二位!
ouyh12345 2010-11-10
  • 打赏
  • 举报
回复
void swap(int *a, int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}

如果a和b的值一样,是什么结果?
baihacker 2010-11-10
  • 打赏
  • 举报
回复
void swap(int *a, int *b)
{
if (a != b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
}

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧