切换风格
开启辅助访问 切换到窄版

[提问] Exercise 5: Random numbers

[复制链接]
作者:xwh 
版块:
Discuz!The Future 编程 c语言 发布时间:2018-10-30 22:46:27
17322
xwh 发表于 2018-10-30 22:11:02 | 显示全部楼层 |阅读模式
本帖最后由 xwh 于 2018-10-30 22:17 编辑

Background Unless you are reading a research paper in engineering or computer science, when people write "random number" with regards to computers, they really mean "pseudorandom number". The basic problem is that if you start from a single value (known as the random seed), and do a series of mathematical operations on it, you will not get an actual random number -- every time you start from the same random seed, you will get the same number!
To quote one of the giants in computer science,
"Anyone who attempts to generate random numbers by deterministic means is, of course, living in a state of sin."  - John von Neumann
However, pseudorandom numbers are good enough for this course.

Technical details Generating a random number: getRand() requires extra #include files!



  1. #include <stdio.h>
  2. #include <stdlib.h>  // extra includes!  
  3. #include <time.h>   /* Get a random number from 0 to 0.9999999     (
  4. you don't need to understand this function)   
  5. ***** DON'T MODIFY THIS FUNCTION *****  */  
  6. float getRand() {     
  7. return rand() / (RAND_MAX+1.0);
  8. }  
  9. int main() {      
  10. srand( time(NULL) ); // init random      
  11. getRand(); // kick-start the random numbers        
  12. float number = getRand();      
  13. printf("Random number: %f\n", number);      
  14. getchar();
  15. }  
复制代码
Your task... Write a "dice rolling" game. You are probably familiar with 6-sided dice, but some games use dice with 4, 6, 8, 10, 20, and 100 sides!
• Make the computer pick a random number for a 6-sided die and a 20-sided die.
• Use the getRand() function, but do not modify it.
• Write an int rollDie(...) function to get a random value. o have one integer argument for the value of the die (int number_of_sides), o call the getRand() function. o take the value it returns (a float between 0 and 0.999...) and do some math to transform that into an int between 1 and number_of_sides inclusive). o return the number.
• Your int main() must contain only:
  1. int main() {
  2.         srand(time(NULL));
  3.         getRand();
  4.         int value = 0;     
  5.         value = rollDie(6);   
  6.         printf("6-sided die: %i\n", value);      
  7.         value = rollDie(20);   
  8.         printf("20-sided die: %i\n", value);      
  9.         getchar();
  10. }  
复制代码




ctx 发表于 2018-10-30 22:35:06 | 显示全部楼层
本题给出了一些限制,比如不能更改相关函数的内容,所以只能利用所给的0~0.9999999.....的随机数,并对其进行相关相关的处理。
我们看main函数在调用rollDie函数并传入了数值6和20,说明我们可以利用传入的数值。
解题思路:
思路一:由于给出的随机数值是0~0.9999999.....,如果要取1~6,则我们可以将给出的随机数乘6,在向上取整(或向下取整+1),如果要取1~20,则我们可以将给出的随机数乘20,在向上取整(或向下取整+1)。
思路二:由于给出的随机数值是0~0.9999999.....,我们可以将其乘以任意大于20的数,然后按照需求进行判断,如满足1~6或1~20则取整后输出,否则重来。
建议参考:c语言生成随机数
http://tfuture.azurewebsites.net ... id=95&fromuid=1


c语言数值四舍五入参考:
C语言中实现四舍五入:
(int)(a+0.5)即可。
很巧妙的用了取整规则。
也不用导入math.h
同样注意负数的情况。
把 + 换成 - 即可。

  1. float f = …..;
  2. int i = (int)(f + 0.5);
复制代码

i就是f四舍五入的结果。

今天我要介绍在C语言中实现数据四舍五入的算法。
我们知道,C语言中去除小数位采用的方法就是强制性转化成整型类型。那么假如我们要对一个小数保留三个小数位而第四个小数位按照四舍五入的规则进行,
该怎样实现呢?很简单,我们将数字扩大1000倍,使得第四位小数称为新数字的第一位,然后我们可以给它加上0.5后再进行强制性转化。加0.5的原因就是:
假如这个小数位的数值大于5,加上0.5能够实现进位的作用,倘若小于0.5,就没有实现进位的作用。如此,就能实现小数位的四舍五入。然后我们再对这个数值
进行强制性转化,然后再处以1000.0(记住,一定要1000.0,否则就会出现隐式转化),在输出的时候用%0.3f以实现保留三位小数。

  1. # include <stdio.h>
  2. int main(void) {
  3.     float a;
  4.     scanf("%f", &a);
  5.     a = (int)(a*1000+0.5)/1000.0;
  6.     printf("%0.3f", a);
  7.     return 0;
  8. }
复制代码

有一个round函数可以直接调用,
round(x)
参数时double型,返回小数对整数部分的四舍五入值
比如 round(3.623); 返回4

C语言中保留两位小数:小技巧

  1. float a = 3.456; //保留到小数点后两位
  2. float b =(int)((a * 100) + 0.5) / 100.0;
复制代码

输出结果为3.46
精度比较高

  1. float a = 23.456789;

  2. printf(“%.2f”,a); //输出为23.45

  3. #include"stdio.h"
  4. #include"math.h"
  5. void main()
  6. {
  7. float x;
  8. scanf("%f",&x);
  9. int y = round(x);
  10. printf("%d",y);
  11. }

复制代码
回复 支持 反对

使用道具 举报

匿名
ctx 匿名  发表于 2018-10-30 22:46:27
C语言有以下几种取整方法:
    1、直接赋值给整数变量。如:
    int i = 2.5; 或 i = (int) 2.5;
    这种方法采用的是舍去小数部分,可以用于你的问题。
    2、C/C++中的整数除法运算符“/”本身就有取整功能(int / int),而下面介绍的取整函数返回值是double。整数除法对正数的取整是舍去小数部分,可以用于你的问题。但是整数除法对负数的取整结果和使用的C编译器有关。
    3、使用floor函数。floor(x)返回的是小于或等于x的最大整数。如:
    floor(2.5) = 2
    floor(-2.5) = -3
    4、使用ceil函数。ceil(x)返回的是大于x的最小整数。如:
    ceil(2.5) = 3
    ceil(-2.5) = -2
    floor()是向负无穷大舍入,floor(-2.5) = -3;ceil()是向正无穷大舍入,ceil(-2.5) = -2。    5、总结:

  • ceil() 向上取整
  • floor() 向下取整
  • round() 四舍五入
  • 使用时要注意引入头文件math.h


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表