好玩的题目,10个人选4个

本文探讨了使用只有0、1两种输出的随机数生成器来公平地从10个人中选择4人的多种方法。介绍了四种不同的策略,包括直接生成随机数进行筛选、改进版的筛选方法、参与者各自生成随机数参与迭代选择等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一次面试的时候,面试官问我的题,挺有意思的,拿来分享把玩一下,咱们得感谢原创题目的作者哇!

你现在有个随机数发生器只能产生0、1,现在有10个人,要选四个出来,要保证公平,请给出解决方法。

答案不唯一的,欢迎大家在这里分享你的idea

我的方法:

先用0-9编号所有人,下面的方法不会因为编号影响公平性

1,产生4个随机数,组成一个四位二进制数,可表示0-15,输出大于等于10的数时,舍去,再来;输出0-9时,若此人尚未出列,则再来,直至选出四个人。

方法缺点很多,输出0-15,产生一个大于9的数,概率是6/16,太大,当已经生成三个编号时,再生成冲突的概率很大3/10.

2.改进第一种,生成一个编号去掉一个,即原来是10个编号,下一次重新0-9编号,实际上前两次与前一种方法无区别,剩8个人的时候,只用三个随机数发生器就够了。

3.每个人拿一个随机数发生器,

第i轮:每个人都生成一个随机数,1的出列,若1的个数,和已经选出来的人数多于4个,则这些人进入下一轮;若少于4个,则1出列的人加入到那4个名额中,剩下的0的人进入下一轮。

比上边要简单,看起来清晰,貌似用的发生器次数比较少。即时间复杂度较低,较快

4每次选少出列,少的优先进入4个名额,具体地,和3较像

第i轮:每个人一个随机数发生器,全部生成一次,0,1人数少得出列,若这些人加上已经选出的人超过四个,则这些刚出列的人进入下一轮;若小于4个出列,加入到4个名额中,剩余的那些人进入下一轮。

解释:0,1人数少得出列:若1的个数比0少,则1的人出列,若相等再来一次,若0少,则0出列。


方法都很笨,欢迎指教。

<think>好的,用户让我用C语言基础语法实现10好玩的效果。首先,我得确保自己理解用户的需求。他们可能刚学C语言,想通过有趣的小项目来巩固基础,同时增加学习的趣味性。用户提到的“基础语法”意味着不能涉及太复杂的库或者高级特性,比如可能仅限于标准输入输出、循环、条件语句、基本函数等。 接下来,我需要回忆一些常见的C语言小项目或者效果,这些效果既要简单又有视觉或交互上的趣味性。比如,控制台动画、小游戏、动态效果等。然后,我需要筛出适合初学者的,不需要额外库支持的例子。 第一个想到的是彩色文字,虽然标准C不支持颜色,但可以通过转义序列实现。这需要确认不同终端是否支持,但大多数现代终端都支持,所以可以作为一个例子。然后是进度条,用循环和刷新缓冲区来实现动态效果。 ASCII艺术动画也是一个不错的择,比如旋转的符号,用简单的循环和延时。贪吃蛇和打字效果也是经典的小项目,虽然贪吃蛇可能需要稍微复杂一点的控制,但用基本语法还是可以实现的。 数字雨效果可能有点复杂,但可以用随机数和循环来模拟。计算器、猜数字游戏和迷宫游戏都是基础但有趣的应用。烟花模拟可能需要一些数学计算,但用字符模拟还是可行的。 在列举这些例子时,要确保每个例子都附有核心代码,并且代码足够简洁,用户能够理解。同时,要提醒用户编译运行的环境,比如需要支持ANSI转义的终端,或者Windows下可能需要不同的处理。 另外,需要注意代码的可读性,避免使用过于复杂的结构,保持变量名清晰。比如在贪吃蛇的例子中,使用简单的数组和循环来处理移动和显示。还有,考虑到用户可能在不同的操作系统下,比如Windows和Linux,转义序列可能有所不同,可能需要给出提示。 最后,检查每个例子是否符合基础语法的要求,没有使用第三方库,主要依赖stdio.h, stdlib.h, time.h等标准头文件。确保每个例子的代码没有错误,能够编译运行,并且确实能产生所述效果。 总结下来,整理这10个例子时,要兼顾趣味性和教学性,让用户在实践中巩固基础,同时感受到编程的乐趣。</think>以下是10个使用C语言基础语法实现的趣味效果及核心代码片段(完整代码需要自行补充): 1. **彩色文字输出** ```c printf("\033[1;31m红色文字\033[0m"); printf("\033[1;32m绿色文字\033[0m"); // 使用ANSI转义序列实现颜色变化 ``` 2. **动态进度条** ```c for(int i=0; i<=100; i++){ printf("\r[%-100s] %d%%", bar, i); fflush(stdout); usleep(100000); } // \r实现行首覆盖,fflush强制刷新缓冲区 ``` 3. **ASCII艺术动画(旋转符号)** ```c char spin[] = {'|', '/', '-', '\\'}; while(1){ printf("\r%c", spin[i%4]); usleep(200000); } ``` 4.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值