求教一个c小程序。

Truly 2002-08-24 10:16:36
是这样一个问题,就是计算机事先生成4个0-9且不重复的随机序列,然后由用户来猜,如果位置和数字完全正确就是a,如果数字正确而位置不正确就是b,比如计算机抽出2,9,3,1,如果回答2,9,1,0,就输出2a1b。
一个文曲星上的游戏。
关键是求教怎样生成4个不重复的随机数。

...全文
42 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Truly 2002-08-24
  • 打赏
  • 举报
回复
谢谢zheng_can(nothrow) 和kingofvc(还是喜欢97) 。
n5(先学好C++再说) 的方法确实存在缺陷,可能导致无限延迟。
zhichao8336 2002-08-24
  • 打赏
  • 举报
回复
重新设置随机种子,具体怎么样自己看
zheng_can 2002-08-24
  • 打赏
  • 举报
回复
vector<int> tmp( 10 );
vector<int> result( 4 );
int p = 0;
for ( int i = 0; i < 4; ++i ) {
p = ( p + rand() ) % 10;
while ( tmp[p] != 0 ) { p = ( p + 1 ) % 10; }
tmp[p] = p;
result[i] = p + 1;
}
kingofvc 2002-08-24
  • 打赏
  • 举报
回复
这样还是听麻烦 还是在给number【i】赋值时用randnum-1吧
kingofvc 2002-08-24
  • 打赏
  • 举报
回复
哦 你要的是0~9的话 rand()%10;
kingofvc 2002-08-24
  • 打赏
  • 举报
回复
int number[4];
int select[10];
for(int i=0;i<10;i++)
{select[i]=0;}
srand((unsigned)time());
for(i=0;i<4;)
{
randnum=rand()%11;
if(!select[randrum])
{
select[randrum]=randnum;
number[i]=randum;
i++;
}
}
zheng_can 2002-08-24
  • 打赏
  • 举报
回复
对于我的方法
只用取四次随机数就可以了

如果用 n5(先学好C++再说) 的方法
你能够保证计算的时间吗?
要是每次算出来的数都是一样的怎么办?
kingofvc 2002-08-24
  • 打赏
  • 举报
回复
对不起大小应为10
Truly 2002-08-24
  • 打赏
  • 举报
回复
不错的想法,能否给出代码?
kingofvc 2002-08-24
  • 打赏
  • 举报
回复
判断是否选择了没有的元素可以使用步长为1 大小为4的散列表
kingofvc 2002-08-24
  • 打赏
  • 举报
回复
for的条件是i<4 那么i++可以在选到合适的值时才执行
for(int i=0;i<4;)
{
if(选到了) i++;
}
Truly 2002-08-24
  • 打赏
  • 举报
回复
为什么没人回答啊?
Truly 2002-08-24
  • 打赏
  • 举报
回复
这种方法我也试了,可是重新取之后又有重复的可能,而如何在重取之后重新跳入检查的循环呢?
看我的程序应如何改进:
for(i=0;i<4;i++)
{
r[i]=rand()%10;

for(j=0;j<i;j++)
if(r[j]==r[i])
{
r[i]=rand()%10;
}
n5 2002-08-24
  • 打赏
  • 举报
回复
我的方法:如果发现取得的随机数与前面的有重复,重新取
Truly 2002-08-24
  • 打赏
  • 举报
回复
zheng_can(nothrow)你的算法太复杂了吧。海盗扔人没听说过,不过兔子选王倒是听说过。有没有简单点的?
Truly 2002-08-24
  • 打赏
  • 举报
回复
为什么大家都要误会我的意思呢,我明白用srand( (unsigned)time( NULL ) );来随机化种子,我困惑的是怎样使每次生成的四个数字都各不相同,比如3,2,1,9,而不会出现2,9,2,0。
zheng_can 2002-08-24
  • 打赏
  • 举报
回复
这么说吧:
你听过海盗扔人下海的故事吗?
可以用类似的方法,生成一个随机数 i,然后从 0 开始数,先数 i 步,如果当前这个数已经取过了,则继续判断相邻的那个数,直到碰到一个没被取过的数为止,取得该数
再从刚刚取得的数起,生成一个随机数 i,……………………
总共循环 4 次就可以了
foxmail 2002-08-24
  • 打赏
  • 举报
回复
int nArray[4];
srand((unsigned char)time(NULL));
//srand这个函数我记不大清,如果不对请看msdn
for(i=0;i<4;i++)
{
nArray[i]=rand()%10;
}

69,369

社区成员

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

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