Frossky 发布的文章

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
bcdedit /set hypervisorlaunchtype off

然后重启.
安装intel haxm

撤销上述命令的方式

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
bcdedit /set hypervisorlaunchtype auto

准备

首先装一个必装插件: mechin3. 官网我死活找不到下载入口, 放在网盘上吧。

链接: https://pan.baidu.com/s/1Z1ncM-0G6VFIg3B-AK7LJg?pwd=y4k6 提取码: y4k6
以下根据视频https://www.bilibili.com/video/BV1JR4y1G76z?p=2&spm_id_from=pageDriver整理
blender严重依赖快捷键,并且最好时有全键盘,带有小键盘的那种。然而笔记本上没有,可以勾选编辑->偏好设置->输入->模拟键盘,用主键盘区的数字键替代小键盘.

重要操作步骤:
要先选中物体, 然后再进入点线面的编辑模式, 编辑模式是针对某一个物体编辑的,此时不能再选中其他物体编辑.

Undo操作记录步骤:
编辑->偏好设置->系统->撤销次数(32~256)

快捷键(按照视频中出现顺序)

  • 简便起见, 以ahk的快捷键简述. ^=Ctrl, !=Alt, +=shift, &=连续按键 #=Win键
  • 不加说明的话,数字键1、2、3……都是指的是小键盘而不是主键盘
  • 部分快捷键后面加x/y/z可以指定在对应轴上应用效果. 如果这时候按Shift和x/y/z则是排除在对应轴上应用效果.
  • 双击x/y/z则是在物体的x/y/z轴上应用效果. 如s&x是在世界坐标上缩放, s&x&x是在物体坐标上缩放. 如果物体旋转过, 这两种方式肯定会有不同应用.
快捷键 描述
中键 旋转视图
+中键 移动视图
!中键 吸附到前后左右等视图
` 视图菜单
操作中&右键 取消操作
+A 创建物体菜单
Tab 切换物体模式/编辑模式中的点线面模式
1 前视图
^1 后视图
3 右侧视图
^3 左侧视图
5 切换正交视图
7 顶视图
^7 底视图
Z 切换渲染模式
+Z 线框视图, 线框视图下选择线,可以选择到背面被遮挡的部分
!Z 半透明视图
.(小键盘) 视图缩放到当前物体. 菜单:左上角->视图->框显所选
/(小键盘) 独立显示当前物体,菜单:左上角->视图->局部视图->切换到局部视图
G 抓取并移动, 注意在物模式下会移动原点,在编辑模式下则不会(原点不会选中)

物体模式下

快捷键 描述 扩展支持
R 旋转Rotate &X/Y/Z&角度数字
S 缩放Scale &X/Y/Z&倍数数字
+D 复制物体 &X/Y/Z
N 查看物体变换属性是否已经应用
^A 确认物体形变为实际形变
+S 将游标放回0点
+右键 3D游标放到鼠标处
^P 两物体建立父子关系一并移动
H 隐藏物体
^J 联合两个物体为一组
  • 设置原点: 右键菜单->设置原点->原点到3D游标

面模式下

快捷键 描述 扩展支持, 扩展含义
I 内插面
E 挤压Extrude
G 抓取并移动 &X/Y/Z, 沿轴向
^B 倒角 &滚轮, 平滑度
+N 修复面倒错
L 选择相连所有面
F 选择相连平面
^+(Ctrl加) 扩展选择相邻面(好像也是选择相连面)
^- 缩回选择相邻面

放样: 选中两个面, 点右键->LoopTools->Loft

边模式下

快捷键 描述 扩展支持, 扩展含义
!左键 循环选择
^左键 连续选择
+左键 取消选择
^B 倒角 &滚轮, 平滑度; &C, 钳制重叠(不允许重叠)
^R 增加环绕边
P 分离物件
!S 沿法线缩放
A 全选
M 融合菜单, 其中按距离融合可以将重叠的的边融合在一起
X 溶解菜单
^E 边菜单 可以标记锐边
^1(主键盘) 转换为细分曲面

点模式下

快捷键 描述 扩展支持, 扩展含义
+^B 倒角
^B&V 倒角
F 闭合所有点为面
E 挤出点为线
!E 挤出菜单
B 框选模式
K 切线成点 &左键&A(笔直切)&左键&C(切穿)&回车
G 平移(每次移动固定长度)
G&G 滑移(每次移动固定百分比)
M 合并,如可以将所有的点合并成1个点从而生成点
!M 拆分
  • 镜像孔: 此模式下右上角网格->对称

    注意: 点模式下合成的面, 如果不切换到面模式下就直接挤出为体,似乎这个体有点儿问题, 例如不能正确切分物体. 感觉是个Bug.

修改器

生成倒角

修改点:

  • 偏移量
  • 段数
  • Angle模式
  • 硬化法向
    附加修改:
  • 物模式->右键->平滑着色
  • 物体数据属性->法向->自动光滑
    以权重方式倒角:
  • 边模式选中要倒角的边->按N键调出属性菜单->平均倒角权重设置为1->选择倒角方式为权重

生成镜像

将生成目标物体的镜像,注意需要把物体原点挪到世界原点

生成实体化

似乎是让实心物体变为薄壁结构

形变曲线

让物体沿曲线移动,就像套在曲线上一样

  • 需要将物体在未应用此修改器前调整到世界原点
  • 需要调整看是沿着哪个轴形变(如Z轴)
  • 一旦调整正确后, 按G抓取移动, 并锁定对应的轴(如Z轴)

布尔运算

  • 布尔运算在生成器中应在最前面, 特别是在倒角的前面
  • 布尔运算后再倒角,可能遇到伪影问题, 此时应用布尔运算, 将物体上的顶点与边缘连接的线不垂直的,改为垂直. 方法是: 选择垂线的两个端点, 按J, 然后选中不垂直的造成伪影的线, 点击delete,选择融合边
  • 布尔运算会造成N-gon问题, 也就是超过4条边的多边形问题, 如五边形/六边形等等, 会造成渲染和其他种种问题, 如环切不能穿越N-gon. 此时需要用点合并(3.1上没找到)或者用K将N-gon限制在很小区域,避免大面积着色不良.

插件

Bool tool

快捷键 描述 扩展支持
+^B bool命令菜单
^- 布尔减

Copy Attributes Menu

用于复制修改器

  • 点击目标->Shift点击源->^C->选择要复制的属性->确定

Add Curve/Mesh: Extra Objects

曲线

网格和曲线转换

物体模式选中物体->左上角“物体”下拉菜单->转换->曲线
辨别是曲线还是网格:网格的编辑模式有点线面,曲线没有。另外,左上角的菜单里面,如果是网格会显示网格菜单,如果是曲线会显示曲线菜单

曲线加粗

曲线菜单(右下侧绿色两方点连一个曲线)->倒角->设置值

曲线转网格

  • 物体模式下: 左上角->物体->转换->网格
  • 另一种曲线转网格然后还能减少网格数量的方式: 物体模式下, ^1(主键盘)增加细分->在修改器中删除细分->按上一条的方法转换网格, 然后就会发现网格数减少

快捷键

快捷键 说明
^1(主键盘) 设置细分1级

菜单

添加阴影显示效果

右上角4个小球右边的下拉箭头, 选中阴影Cavity

按各自原点操作

中上方两个球->下拉菜单选择各自的原点

单个物体变为线框显示

右下侧黄色方块带四个角的图标物体属性->视图显示->显示为选择线框

吸附到目标表面移动

中上方吸铁石图标右侧的图标, 下拉->选择旋转对齐目标, 然后按G再按Ctrl就可以吸附到目标表面;

材质

为整个物体增加新材质

  • 点亮右上角材质小球
  • 选中左下角材质选项对话框
  • 选中一个物体, 点击材质菜单的+新建

应用已有材质

  • 选择材质菜单里的材质球
  • 下拉菜单选择已经新建的材质

为部分物体增加材质

  • 面模式选中面
  • 可以按^+选择相邻面
  • 材质对话框添加一个材质
  • 材质球里选择一个材质
  • 点击指定按钮

材质常用选项

  • 默认表(曲)面:原理化BSDF
目标效果 基础色 金属度 糙度
金属 1 0.3~0.4
  • 默认表(曲)面:自发光(发射)
目标效果 颜色 强度/力度
自发光 红/白 13

渲染

HDRI高动态范围图片

hdrihaven下载hdri, 现在更名为polyhaven
all->overcast(阴天)搜索abandoned slip way下载4K(25M左右)或者8K(100M左右)图片, 真是大啊

  • 回到blender, 点击右下角世界属性地球图标
  • 表(曲)面->颜色旁点击第一个小球, 展开的菜单中选择环境纹理
  • 点击文件夹图标, 选择上面的hdri文件, hdri加载为预览画面
  • 如果不想预览的话, 点击渲染属性小电视图标->胶片->勾选透明

增加背景

  • 使用+A增加平面
  • 增加一个地板, 稍微在物体下面一点
  • 增加个墙面背景, 在要渲染的视角背后
  • 设置材质为暗色金属

增加摄像机

  • 使用+A增加摄像机
  • 需找一个摄像位置
  • 左上角菜单->视图->对齐视图->活动摄像机对齐当前视角
  • 可以选中摄像机按G移动位置
  • 0查看摄像机视角

设置摄像机参数

  • 点击右下角摄像机图标(不知道为什么翻译成了物体数据属性)
  • 选择焦距为135mm
  • 移动摄像机退后G&Z&Z

设置HDRI角度

  • 渲染属性去掉透明
  • 下部拉出另一个窗口
  • 窗口左上角球下拉选择着色编辑器, 将物体改为世界环境
  • 增加一个node wrangler的插件
  • 选中anbandoned......hdr窗, 按^T
  • 左侧mapping窗中调整Z可以旋转hdr,测试照明

设置渲染属性

  • 偏好设置->系统->Cycles渲染设备->CUDA选择GPU
  • 右侧渲染对话框, 渲染引擎选择Cycles
  • 设备选择GPU计算, 如果GPU很弱那么还不如选择CPU
  • 采样->渲染->采样输入200
  • 光程->最多反弹次数设置按如下参数:
总数 漫射 光泽 投射 体积(音量) 透明
6 3 3 4 4 0
  • 右侧选择输出属性打印机照片图标
  • 格式选择分辨率
  • 输出文件格式改为tiff, 16位色深

合成器设置降噪

  • 左上角视图按钮选择合成器
  • 选中选择节点
  • ^A菜单->滤镜->降噪
  • 降噪节点放在中间
  • 降噪法向连接法向,降噪反照率连接反照率(本应还有其他降噪的, 如降噪图像要连接, 但是3.1里找不到了)

合成器设置辉光

  • ^A->滤镜->辉光
  • 加到降噪合成中间
  • 条斑改为雾晕

开始渲染

  • 回到3D视图, 选择实体视图
  • 点击左上角菜单渲染->渲染图像

今年打算好好给公司的软件搭个架子,昨天设想了一下,应该包括三个层次:

层数 名称 作用
3 纯逻辑应用层 完全与硬件和操作系统无关的层,可实现应用的所有逻辑功能,不同功能之间应完全解耦、并充分可配置。并可编译为windows程序进行单元测试和系统测试。
2 中间层 与操作系统相关,可能与硬件无关的。对上提供标准接口,对下提供几种标准接入。(再想想)
1 硬件适配层 硬件驱动,对硬件进行调用。接口标准化。需要在板上调试。在上层测试时被打桩stub的层。

在google搜索embedded software structure发现一篇文章https://www.ssla.co.uk/embedded-software-architecture/ 上来讲得就跟我想的一样;
顺便, 写文章的公司ssla是一家英国的硬件方案公司,提供嵌入式软硬件方案和硬件制造, 在限定时间内(6个月)完成硬件项目的服务.

另外, 关于软件架构这有一篇很好的文章https://blog.csdn.net/best_xiaolong/article/details/108480336
可以关注lua和python在嵌入式架构里的应用

http://www.nongnu.org/lwip/2_1_x/index.html
https://beej.us/guide/bgnet/html/

问题: 如果tcp连接过程中网断了(网线拔出/路由器断电)怎么办?
回答: 参考https://stackoverflow.com/questions/14782143/linux-socket-how-to-detect-disconnected-network-in-a-client-program
总的来说, socket中的sendrecv都不会关心网是不是断了. 正如前述参考回答中所说, tcp send只有在tcp连接没有正确建立或者缓冲溢出的时候才会明确报错, 否则它只会不断重试, 在linux上重试时间可能长达5分钟. 同样,recv如果不设置超时, 就会一直等待, 它也不知道网断了.

参考:
https://blog.csdn.net/qq_35787138/article/details/113923316
https://www.runoob.com/linux/linux-comm-nc.html
windows上的nc使用的是cygwin里带的
注意:windows上的nc.exe命令写端口号前面需要-p,如nc -l 9999在windows平台可写作nc -l -p 9999

TCP Server

nc -l 9999

TCP Client

nc localhost 999
nc www.baidu.com 80
输入命令回车即发送. HTTP是基于TCP的, 所以可以连接HTTP服务器, 再发送GET命令即可

UDP Server

nc -u -l 999

UDP Client

nc -u localhost 999

特别注意: 在Win10上通过cmd和bash使用nc, 都是tcp模式localhost连接可用, 而udp server/client localhost连接不可用. 一定要用wsl2的模式才行(ubuntu 18.04). 在不同主机上连接倒都没有问题

UDP Broadcast

nc -b -u 192.168.1.255 9999
注意, windows版本的nc里面都没有-b选项.

由于ftp不止使用了1个端口,包括连接时候使用的控制端口和数据传输时候使用的数据端口. 并且ftp协议本身会发送ip地址和数据端口号(而不是用frp服务器的端口号),所以frp配置有些与众不同.
要点:

  • ftp服务器使用Passive被动模式, 并且配置被动模式端口范围
  • frp端口映射中, ftp控制端口数字可以和frp服务器映射端口不一致(如一个使用2121, 另一个使用3131), 但ftp数据端口必须和frp服务器映射端口数字一致(如使用3333就必须都是用3333).
  • 非必须: ftp服务器配置net转换地址. 这个似乎在filezilla客户端上不是必须的, filezilla会自动对NAT前的地址替换为服务器地址.

ftp服务器配置命令, 以pyftplib为例(如果需要服务器可写,再加上选项-w):

python -m pyftpdlib -r 3333-3334

frpc.ini配置:

[ftp_data1]
type =tcp
local_ip = 127.0.0.1
local_port = 3333
remote_port = 3333

[ftp_data2]
type =tcp
local_ip = 127.0.0.1
local_port = 3334
remote_port = 3334

[ftp_control]
type =tcp
local_ip = 127.0.0.1
local_port = 2121
remote_port = 3131

忽然想起这个命题, 在若干年以前, 军训的时候教官说我们班上40多人里必然有两个人同一天过生日, 还说没看过我们的生日, 感觉跟魔术一样. 让大家验证了一下, 居然有两组人的生日都在同一天. 而在之前公司里面20多个人, 也有同一天过生日的. 那么究竟一组人群里重复生日的概率是多少呢? 想验证一下.
用node.js来验证, 验证10万组:

const testTimes = 100000
const yearLength = 365

function main(){
  var doubledBirthdaysArrayLengths = []
  for(let i = 0; i < testTimes; i++){
    doubledBirthdaysArrayLengths.push(doubledLength())
  }
  console.log("一组人群中有相同生日的概率是多少?")
  console.log("有重复生日的人群的人数: ")
  console.log(doubledBirthdaysArrayLengths)
  console.log('生日重复的一组中最多人数: ', Math.max(...doubledBirthdaysArrayLengths))
  console.log('生日重复的一组中最少人数: ', Math.min(...doubledBirthdaysArrayLengths))
  console.log('生日重复的一组中平均人数: ', average(doubledBirthdaysArrayLengths))
  distribute(doubledBirthdaysArrayLengths)
}
function distribute(arr){
  let peopleNumsofGroups = [] //一组中的人数为数组下标, 数组值为此组人数出现的次数.
  for(let i = 0; i < yearLength; i+=1){
    peopleNumsofGroups.push(0)
  }
  for(let a of arr){
    peopleNumsofGroups[a]++
  }
  // console.log('Distribute: ', days)
  console.log('重复生日人群, 某一人数出现的次数:')
  printArrayInTable(peopleNumsofGroups, 0)
  let probes = [], sum = average(peopleNumsofGroups) * peopleNumsofGroups.length
  for(let i = 0; i < yearLength; i+=1){
    if(i == 0){
      probes[i] = peopleNumsofGroups[i]/sum * 100
    }else{
      probes[i] = peopleNumsofGroups[i]/sum * 100 + probes[i - 1]
    }
  }
  console.log('概率:')
  printArrayInTable(probes, 2)
}
function printArrayInTable(arr, fixDigits){
  console.log('\t[0]\t[1]\t[2]\t[3]\t[4]\t[5]\t[6]\t[7]\t[8]\t[9]')
  for(let row = 0; row < yearLength / 10 + 1; row+=1){
    let out = '[' + row + ']\t' 
    for(let col = 0; col < 10; col+=1){
      let index = row*10 + col
      if(index >= yearLength){
        return
      }
      out += arr[row*10 + col].toFixed(fixDigits) + '\t'
    }
    console.log(out)
  }
}
function average(arr){
  let sum = 0
  for(let a of arr){
    sum += a
  }
  return sum / arr.length
}

function doubledLength(){
  let birthdays = []
  for(let i = 0; i < yearLength + 1; i+=1){
    var birthday = parseInt(Math.random()*yearLength)
    if(findDouble(birthday, birthdays)){
      birthdays.push(birthday)
      // console.log("birthdays: ", birthdays)
      return birthdays.length
    }
    birthdays.push(birthday)
  }
  return birthdays.length
}

function findDouble(obj, arr){
  for(let a of arr){
    if(a == obj){
      return true
    }
  }
  return false
}

main()

输出结果如下:

一组人群中有相同生日的概率是多少?
有重复生日的人群的人数: 
[
  19, 22, 14,  3, 13, 25, 10, 24, 56,  5, 15, 27,
  25, 18, 27, 19, 22, 38, 21, 41,  9, 13, 37, 36,
  28, 25, 22, 29, 11, 23, 19, 14, 13, 16, 32, 26,
   8, 19,  7, 36,  6, 22, 18, 23, 20, 33, 32, 21,
  64, 22, 48, 43,  5, 16, 14,  7, 19, 32, 15, 16,
  15, 33, 58, 19, 26, 18, 45, 31,  4,  5, 30, 26,
  14, 19, 31, 14,  6,  9, 27, 12, 47, 51,  7, 21,
  16, 42, 66, 15, 28, 32, 18, 10, 12, 14, 10, 16,
  23, 15, 23,  8,
  ... 99900 more items
]
生日重复的一组中最多人数:  84
生日重复的一组中最少人数:  2
生日重复的一组中平均人数:  24.60991
重复生日人群, 某一人数出现的次数:
        [0]     [1]     [2]     [3]     [4]     [5]     [6]     [7]     [8]     [9]
[0]     0       0       279     577     842     1006    1334    1520    1873    1949
[1]     2223    2441    2627    2684    2975    2878    3110    3148    3229    3227
[2]     3269    3199    3180    3195    2974    3076    3014    2846    2747    2650
[3]     2624    2440    2327    2111    2096    1863    1807    1647    1564    1399
[4]     1271    1162    1023    996     884     773     738     642     575     541
[5]     460     394     384     325     277     247     203     173     143     148
[6]     111     97      79      71      55      53      41      36      31      18
[7]     24      16      9       16      4       5       7       2       6       6
[8]     1       0       1       0       2       0       0       0       0       0
[9]     0       0       0       0       0       0       0       0       0       0
[10]    0       0       0       0       0       0       0       0       0       0
[11]    0       0       0       0       0       0       0       0       0       0
[12]    0       0       0       0       0       0       0       0       0       0
[13]    0       0       0       0       0       0       0       0       0       0
[14]    0       0       0       0       0       0       0       0       0       0
[15]    0       0       0       0       0       0       0       0       0       0
[16]    0       0       0       0       0       0       0       0       0       0
[17]    0       0       0       0       0       0       0       0       0       0
[18]    0       0       0       0       0       0       0       0       0       0
[19]    0       0       0       0       0       0       0       0       0       0
[20]    0       0       0       0       0       0       0       0       0       0
[21]    0       0       0       0       0       0       0       0       0       0
[22]    0       0       0       0       0       0       0       0       0       0
[23]    0       0       0       0       0       0       0       0       0       0
[24]    0       0       0       0       0       0       0       0       0       0
[25]    0       0       0       0       0       0       0       0       0       0
[26]    0       0       0       0       0       0       0       0       0       0
[27]    0       0       0       0       0       0       0       0       0       0
[28]    0       0       0       0       0       0       0       0       0       0
[29]    0       0       0       0       0       0       0       0       0       0
[30]    0       0       0       0       0       0       0       0       0       0
[31]    0       0       0       0       0       0       0       0       0       0
[32]    0       0       0       0       0       0       0       0       0       0
[33]    0       0       0       0       0       0       0       0       0       0
[34]    0       0       0       0       0       0       0       0       0       0
[35]    0       0       0       0       0       0       0       0       0       0
概率:
        [0]     [1]     [2]     [3]     [4]     [5]     [6]     [7]     [8]     [9]
[0]     0.00    0.00    0.28    0.86    1.70    2.70    4.04    5.56    7.43    9.38
[1]     11.60   14.04   16.67   19.36   22.33   25.21   28.32   31.47   34.70   37.92
[2]     41.19   44.39   47.57   50.77   53.74   56.81   59.83   62.67   65.42   68.07
[3]     70.70   73.14   75.46   77.57   79.67   81.53   83.34   84.99   86.55   87.95
[4]     89.22   90.38   91.41   92.40   93.29   94.06   94.80   95.44   96.01   96.56
[5]     97.02   97.41   97.79   98.12   98.40   98.64   98.85   99.02   99.16   99.31
[6]     99.42   99.52   99.60   99.67   99.72   99.78   99.82   99.85   99.88   99.90
[7]     99.93   99.94   99.95   99.97   99.97   99.98   99.98   99.98   99.99   100.00
[8]     100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[9]     100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[10]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[11]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[12]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[13]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[14]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[15]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[16]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[17]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[18]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[19]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[20]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[21]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[22]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[23]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[24]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[25]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[26]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[27]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[28]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[29]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[30]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[31]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[32]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[33]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[34]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00
[35]    100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00  100.00

可以看到, 班上有40个人的时候, 有重复生日的概率已经高达90%左右了. 按中国班级的规定, 小学标准是45人,有94%的概率有两人同一天过生日. 初高中是50人, 概率则高达97%.如果把两个班放在一起, 概率就是100%了.