生成随机数,并制作简易“抽奖”系统

1.生成随机数所用到的函数

#include <stdlib.h>
srand();
(类型,如果是整型则这个括号不用写)rand()
//rand() 函数是一个无参数的函数,它用于生成伪随机整数。尽管函数不接受参数,但仍然需要使用括号来表示函数调用的语法。
//rand()生成的值是非负整数,通常情况下最小值为0,最大值为RAND_MAX=32767
//接下来是time函数
#include<time.h>
time(NULL)
//通常我们不需要获取当前时间戳,便在函数time()括号中加个NULL
//如果要获取时间戳,可以这样做
#include <stdio.h>
#include <time.h>

int main() {
    time_t timestamp; // 声明一个 time_t 类型的变量来存储时间戳
    time(&timestamp); // 使用 time 函数获取当前时间戳并存储在 timestamp 变量中

    // 打印时间戳
    printf("当前时间戳:%ld\n", timestamp);

    return 0;
}

//time_t time(time_t *timer);这时time()函数的原型

 这里解释一下时间戳

时间戳是一个表示特定时间点的数字值,通常以秒为单位,从某个固定的起始点(通常称为"epoch",即时代)开始计算。时间戳用于在计算机系统中记录和比较时间,以便进行时间相关的操作和计算。

以下是时间戳的详细解释:

1. **起始时间点(Epoch)**:时间戳是相对于某个固定的起始时间点进行计算的。不同的计算机系统和编程语言可能使用不同的起始时间点。在Unix和类Unix系统中,通常使用的起始时间点是格林威治时间(GMT)的1970年1月1日午夜(00:00:00 UTC),这个时间点被称为Unix时间戳或Unix纪元。

2. **单位**:时间戳通常以秒为单位计算,但也可以以毫秒、微秒或纳秒等更小的时间单位进行计算,取决于需要的精度。

3. **整数值**:时间戳是一个整数值,表示自起始时间点以来经过的时间量。这个整数可以是正数(未来的时间)或负数(过去的时间)。

4. **用途**:时间戳广泛用于各种应用,包括记录事件的发生时间、进行时间相关的计算、计算时间间隔、定时任务调度等。它们也用于网络通信中的时间同步和安全证书的验证。

5. **转换**:时间戳可以转换成日期和时间的可读格式,以便人类理解。这个过程通常涉及到时区的考虑,因为时间戳是以GMT或UTC为基准的。不同的地区和国家使用不同的时区,因此需要将时间戳转换成本地时区的日期和时间。

6. **示例**:比如,Unix时间戳表示为整数 1632423597,这对应于格林威治时间的2021年9月24日下午3:53:17(UTC时间)。将其转换为本地时区可能会产生不同的日期和时间。

时间戳是一种方便的方式来处理和比较时间信息,因为它是一个简单的数字,易于存储和传递。在编程中,时间戳常常用于计算两个时间点之间的时间差,执行定时任务,记录事件的发生时间等等。

2.利用这些函数生成随机数 

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    srand(time(NULL));
    for (int i=0;i<=100;i++)
    {
        int randomvalue = rand();
        printf("%d ", randomvalue);
    }

    return 0;
}
//这是一个最简单的伪随机数生成器,要注意计算机是不可能生成绝对的随机数的。

注意: 这里的srand如果放在for循环里头,短时间内所获得的时间戳可能相同,有可能会生成一模一样的数,所以我们把它放在开头,使每次都能生成不同的随机数序列,增加随机性。

这里的for循环是为了让生成一百个随机数

我们来运行一下看看结果

 3.尝试生成0到100之间的随机数和0到1之间的随机数

 首先我们先尝试生成0到100之间的随机数,这很容易,只需要让随机数模上一个100即可

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

int main()
{
    srand(time(NULL));
    for (int i=0;i<=100;i++)
    {
        int randomvalue = rand()%100;
        printf("%d ", randomvalue);
    }

    return 0;
}

我们来看看结果

 下面我们生成0到1之间的随机数

试着思考我们现有的值中是不是有一个RAND_MAX,它是生成随机数的最大值,所有的值都不会大于它,那么我们只要让它做分母即可,但我们得到的值是一个小数,如果直接用‘ / ’号,得到的所有值都是0,所以我们要把它们转换成double或者float类型,这里我使用float类型,我们看看会有几个数字小于0.01

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

int main()
{
    srand(time(NULL));
    for (int i=0;i<=100;i++)
    {
        float randomvalue = (float)rand() / RAND_MAX;
        if (randomvalue < 0.01)
        {
            printf("%f", randomvalue);
        }
    }

    return 0;
}

运行多次后基本上是0到3个左右 。

4.编写抽奖小游戏

1.首先我们要编写游戏界面,可以自定义一个menu函数

2.其次,我们要限制奖品的概率

3.我们要规定好初始本金与花销与利润

4.利用我所讲的随机数生成方法制作抽奖系统

一下是我写的一个简单抽奖系统,大家可以自己尝试一下再看我的。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
    printf("参与游戏您就有机会获得以下奖励\n");
    printf("*********一等奖1000元*********\n");
    printf("*********二等奖 100元*********\n");
    printf("*********三等奖   10元*********\n");
    printf("*********1.play2.exit*********\n");
}
int main()
{
    float firstprize = 0.001;
    float secondprize = 0.009;
    float thirdprize = 0.3;
    srand(time(NULL));
    int num = 0;
    menu();
    printf("请选择:");
    scanf("%d", &num);
    int money = 5000;
    switch (num)
    {
        case 1:
        {
            int first = 0;
            int second = 0;
            int third = 0;
            int none = 0;
            int n = 0;
            printf("一次十块钱请问您要玩几次");
            scanf("%d",&n);
            money += 10 * n;
            for (int i = 0; i < n; i++)
            {
                float randomvalue = (float)rand() / RAND_MAX;
                if (randomvalue <= firstprize)
                {
                    first++;
                    money -= 1000;
                }
                else if (firstprize < randomvalue && randomvalue < secondprize)
                {
                    second++;
                    money -= 100;
                }
                else if (secondprize < randomvalue && randomvalue < thirdprize)
                {
                    third++;
                    money -= 10;
                }
                else
                {
                    none++;
                }
            }
            printf("一等奖%d次,二等奖%d次,三等奖%d次,未获奖%d次,", first, second, third, none);
            printf("您总共获得%d元", first * 1000 + second * 100 + third * 10);
            printf("期待您下次来玩\n");
            break;
        }
        case 2:
        {
            printf("好的");
            break;
        }
        default:
        {
            printf("无效选择");
            break;
        }
    }
    printf("利润为%d", money);
    return 0;
}

至此完毕,小白编写不易,点个赞吧各位看官。

下面是修改版

#include <windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int game(int* money)
{
    float firstprize = 0.001;
    float secondprize = 0.009;
    float thirdprize = 0.3;
    int first = 0;
    int second = 0;
    int third = 0;
    int none = 0;
    int n = 0;
    printf("一次十块钱请问您要玩几次");
    scanf("%d", &n);
    *money += 10 * n;
    for (int i = 0; i < n; i++)
    {
        float randomvalue = (float)rand() / RAND_MAX;
        if (randomvalue <= firstprize)
        {
            first++;
            *money -= 1000;
        }
        else if (firstprize < randomvalue && randomvalue < secondprize)
        {
            second++;
            *money -= 100;
        }
        else if (secondprize < randomvalue && randomvalue < thirdprize)
        {
            third++;
            *money -= 10;
        }
        else
        {
            none++;
        }
    }
    printf("一等奖%d次,二等奖%d次,三等奖%d次,未获奖%d次,", first, second, third, none);
    printf("您总共获得%d元", first * 1000 + second * 100 + third * 10);
    printf("期待您下次来玩\n");
    return money;
}
void menu()
{
    printf("参与游戏您就有机会获得以下奖励\n");
    printf("*********一等奖1000元*********\n");
    printf("*********二等奖 100元*********\n");
    printf("*********三等奖   10元*********\n");
    printf("*********1.play2.exit*********\n");
}
int main()
{
    int money = 5000;
    srand(time(NULL));
    int num = 0;
    menu();
    printf("请选择");
    scanf("%d", &num);
    do
    {
        if (num == 1)
        {
            system("cls");
            game(&money);
        }
        menu();
        printf("请选择");
        scanf("%d", &num);
        if (num != 1)
        {
            printf("利润为%d", money);
        }
    } while (num == 1);
    printf("利润为%d", money);
    return 0;
}

 

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值