掷骰子问题之C语言随机数

之前有看到有人在写“掷骰子100次,打印出掷骰子”的代码

便找空写了一下代码,不是很好,仅供大家讨论

因为掷骰子的结果是在1~6之间随机产生的,因此代码也必须要模拟随机的情况

但是电脑是无法真正的产生随机数,只能以函数近似生成的方式得到,因此我的代码也是基于这种方式写出的

得到随机数的方式有两步,第一步是设置产生随机数的种子,第二步才是根据种子得到随机数

这两步分别对应了两个函数:srand()和rand()

并且由于是函数生成,函数的特性决定了如果种子一样,会得到相同的结果,也就不存在随机的情况了

为了避免这种情况,使用时间来作为随机数的种子,这里使用了time()函数

代码如下:

#include <stdio.h>
#include <stdlib.h>  // 使用了srand和rand函数
#include <time.h>  // 使用了time函数

int main()
{
    // 按时间设置生成随机数的种子
    srand((unsigned)time(NULL));
    // 设置一个长度为6的int数组,存放掷色子的结果
    int numbers[6] = {0, 0, 0, 0, 0, 0};
    // 循环掷色子100次
    for (int i = 0 ; i < 100; i++) {
        // 生成随机结果,控制在1~6之间
        int num = rand() % 6 + 1;
        // 根据结果进行对应统计
        switch (num) {
            case 1:  // 骰子结果为1时的计数
                numbers[0]++;
                break;
            case 2:  // 骰子结果为2时的计数
                numbers[1]++;
                break;
            case 3:  // 骰子结果为3时的计数
                numbers[2]++;
                break;
            case 4:  // 骰子结果为4时的计数
                numbers[3]++;
                break;
            case 5:  // 骰子结果为5时的计数
                numbers[4]++;
                break;
            case 6:  // 骰子结果为6时的计数
                numbers[5]++;
            default:
                break;
        }
    }
    // 掷色子完成后遍历数组输出结果
    for (int j = 0; j < 6; j++) {
        // 输出结果
        printf("%d", numbers[j]);
        if (j < 5) {
            printf(" - ");
        }
        else
        {
            printf("\n");
        }
    }

    return 0;
}

需要注意的是,由于计算机的运行速度非常快,因此设置种子是不能在for循环中进行的

否则会造成很多次种子是一样的,造成产生的值也一样的后果

本文参考了如下文章:

http://blog.chinaunix.net/uid-25513153-id-200003.html

时间: 2024-08-06 03:43:32

掷骰子问题之C语言随机数的相关文章

模拟算法_掷骰子游戏&amp;&amp;猜数游戏

模拟算法是用随机函数来模拟自然界中发生的不可预测的情况,C语言中是用srand()和rand()函数来生成随机数. 先来介绍一下随机数的生成: 1.产生不定范围的随机数 函数原型:int rand() 产生一个介于0~RAD_MAX间的整数,其具体值与系统有关系.Linux下为2147483647.我们可以在include文件夹中的stdlib.h中可以看到(Linux在usr目录下,Windows在安装目录下) 1 #include<stdio.h> 2 #include<stdlib

骑士飞行棋第一版(掷骰子方法分开)

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 骑士飞行棋 8 { 9 class Program 10 { 11 12 //在下面的数组存储我们游戏地图各个关卡 13 //数组的小标为0的元素对应地图上的第一格 下标为1的元素对应第二格...下标为n的元素对应n+1

上帝掷骰子吗? 计算机程序构造解释 奇思妙想-摘要

书籍部分概要 上帝掷骰子吗-量子物理史话 假如一个物理概念是无法测量的,它就是没有意义的.对于这个物我合一的世界来说,任何东西都应该是可以测量和感知的.只有可观测的量才是存在的!(不完全性定理,海森堡不确定性原理 低维世界无法感知高维世界,即解释高维世界.或者我相信原子是四维的或者是多维的总之是高于三维世界存在的,所以表现出波力二象性 .)二维度的语言无法描述高维信息,因此语言或表述方法决定了我们能看的多远. 理论决定了我们能够观察什么,(即同样的心智模式.一个人的认知决定了 他能观察到什么事物

掷骰子游戏窗体实现--Java初级小项目

掷骰子 **多线程&&观察者模式 题目要求:<掷骰子>窗体小游戏,在该游戏中,玩家初始拥有1000的金钱,每次输入押大还是押小,以及下注金额,随机3个骰子的点数,如果3个骰子的总点数小于等于9,则开小,否则开大,然后判断玩家是否押对,如果未押对则扣除下注金额,如果押对则奖励和玩家下注金额相同的金钱. 分析:这个题目要求灵活运用多线程的相关知识,达到点击开始按钮时,有3个线程启动,分别控制3颗骰子的转动,在3颗骰子全部转完以后,回到主线程计算游戏结果. 1 //3个线程控制3颗骰

jQuery掷骰子

网上找的jQuery掷骰子效果,测试兼容IE7及以上浏览器,IE6没有测试 js代码如下: 1 $(function(){ 2 var dice = $("#dice"); 3 dice.click(function(){ 4 $(".wrap").append("<div id='dice_mask'></div>");//加遮罩 5 dice.attr("class","dice"

掷骰子游戏和条件语句

1.java掷骰子游戏 public class iftest { public static void main(String[] args) { System.out.println("#####掷骰子游戏#####"); System.out.println("#################"); //投掷三个色子看看今天手气怎么样? int i = (int)(6*Math.random()+1); int j = (int)(6*Math.random

LeetCode 1223. 掷骰子模拟 Dice Roll Simulation - Java - DP

题目链接:1223. 掷骰子模拟 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始编号). 现在,给你一个整数数组 rollMax 和一个整数 n,请你来计算掷 n 次骰子可得到的不同点数序列的数量. 假如两个序列中至少存在一个元素不同,就认为这两个序列是不同的.由于答案可能很大,所以请返回 模 \(10^9 + 7\) 之后的结果. 示例1: 输入:n =

华为历年试题(掷骰子游戏 7)

问题描述: 在掷骰子游戏中,会根据所掷数字在地图中前进几步,前进完成后需要根据当前地图位置所示的障碍进行相应操作,其中障碍表示: 1)  9:无障碍 2)  1:停掷一轮,即下轮所掷数字无效: 3)  2:后退两步,如果已经到起点不再后退: 4)  3:奖励前进一步 如果在游戏过程中,已经走到地图终点,则游戏结束.根据输入的地图数组,和5个骰子数的数组,返回最终玩家前进了多少步. 要求实现函数: void dice(int map_len, int* map, int* dice_val, in

第21本:《上帝掷骰子吗?》

第21本:<上帝掷骰子吗?> 这是一本关于量子论的科普读物,不过作者曹天元把一系列人物和实验用一种小说的形式讲 述了下来,很感叹作者深厚的理论知识和文字功底.这本书在豆瓣上评分在9.3-9.4,我的GTD阅读清单是按照评分顺序来整理的,超过9分的读物如果不 优先阅读真有点对不起书名里的上帝. 这类书既然是科普知识类的书,就很难找到可以执行的行动,这些知识体系能让你的视野开阔,当思考一个问题时不能被其表面现象所迷惑,任何一个定律都 不是绝对适用的.在读到能量不是连续的,而是一份一份的,再想到计算