立即注册找回密码

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

手机动态码快速登录

手机号快速注册登录

搜索

图文播报

查看: 283|回复: 5

如何确定一袋米中的米粒数量是偶数还是奇数?

[复制链接]
发表于 2025-6-12 18:33 | 显示全部楼层 |阅读模式

登陆有奖并可浏览互动!

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录 手机动态码快速登录

×
给出一袋米,要求在尽量不逐一数的情况下,运用最为简便且高效的方法,如何确定这一袋米里面的米粒数量是偶数还是奇数?
我对数学不太了解,但也比较感兴趣。这个问题其实是我偶然想到的,我知道可能找不到准确的答案,但我想通过这个问题,获得数学、统计学,甚至哲学大佬的一些启发。这个问题能不能解决已经不重要了,有一些理论上可行的思路,才是最可贵的。
本问题希望探讨一些关于数论或是自动化工程方面的知识,并不希望得到诸如将一粒米分两半或是偷偷销毁一类米之类的抖机灵回答。
还请各领域大佬指教!

原文地址:https://www.zhihu.com/question/666009766
楼主热帖
回复

使用道具 举报

发表于 2025-6-12 18:34 | 显示全部楼层
好的,作为一个理工生,一般不整那么多花里胡哨的,想知道奇数还是偶数,那就得算算大米到底有多少颗。
高赞确实有类似的设备可以实现这种数大米的功能,但是毕竟这种设备不便宜,现在有工业版本的,那有没有家用版本的。
比如我抓了一小撮大米,然后撒在桌面上,为什么只有一小撮呢?
第一:浪费粮食是不好的
第二:抓太多了大米之间连在一块,得用更复杂的方法,我懒
而一个一个算太慢,能不能用手边的设备来算算到底有多少颗呢?比如我们用手机拍一张照片,像这样。


那么,老规矩,为了方便图像后续处理,我们直接处理成灰度图(其实我后面琢磨了一下,不如去抓r通道效果更好,凑合看吧不管了)


然后我们看看背景颜色的灰度值


还有大米的灰度值


直接根据颜色差值设定阈值二值化图像


可以看到,效果不太好,为啥,因为因为背景光照不均匀有些大米内部颜色和背景混色了,一些大米出现了中空的情况,也好办,弄个导数的二值滤波,再来一次,


好,舒服多了,之后就是简简单单判定联通的白色区域了,然后我们标定后,把计数文本弄回原始图像中,可以看到,程序大米数的非常好,一撮大米一共61个,灰常准确有效。


应该算是图像CV比较入门级的知识点,下次拿去折磨下学生好了.
实验型代码,工程慎用
#include "PainterEngine.h"
px_texture srcTexture;
px_texture dstTexture;

px_void MarkRegion(px_texture* ptexture, px_int x, px_int y,px_color detectcolor, px_color markcolor,px_int *counter)
{
       
        if (x < 0 || y < 0 || x >= ptexture->width || y >= ptexture->height)
        {
                return 0;
        }
        if (PX_SURFACECOLOR(ptexture,x,y)._argb.ucolor== detectcolor._argb.ucolor)
        {
                PX_SURFACECOLOR(ptexture,x,y)=markcolor;
                (*counter)++;
                MarkRegion(ptexture, x + 1, y, detectcolor, markcolor,counter);
                MarkRegion(ptexture, x - 1, y, detectcolor, markcolor,counter);
                MarkRegion(ptexture, x, y + 1, detectcolor, markcolor,counter);
                MarkRegion(ptexture, x, y - 1, detectcolor, markcolor,counter);
        }
}

px_int main()
{
        px_int x, y;
        px_int riceCount=0;
        px_char content[32];
        PainterEngine_Initialize(800, 800);
        PX_LoadTextureFromFile(mp_static, &srcTexture, "assets/sample.png");
        PX_TextureCopy(mp_static, &srcTexture, &dstTexture);
        PX_ImageFilter_dBinarization(&dstTexture,160,3);
       
        for ( y= 0; y < dstTexture.height; y++)
        {
                for ( x = 0; x < dstTexture.width; x++)
                {
                        px_int counter=0;
                        MarkRegion(&dstTexture, x, y, PX_COLOR(255, 255, 255, 255), PX_COLOR(255, 0, 0, 255),&counter);
                        if (counter>100)
                        {
                                riceCount++;
                                PX_sprintf1(content,sizeof(content), "rice %1", PX_STRINGFORMAT_INT(riceCount));
                                PX_FontDrawText(&srcTexture, x, y,PX_ALIGN_LEFTBOTTOM,content,PX_COLOR_RED);
                        }
                }

        }
       
        //sum rice
        PX_sprintf1(content, sizeof(content), "Rice Count:%1", PX_STRINGFORMAT_INT(riceCount));
        PainterEngine_DrawTexture(&srcTexture, 400, 400, PX_ALIGN_CENTER);
        PainterEngine_DrawText(0, 0, content, PX_ALIGN_LEFTTOP, PX_COLOR_RED);
       
       
}如果你想问工程上怎么用,非机器学习方法我估计会拿个比较"标准"的大米图形做增强后作为算子去做卷积,当然上机器学习方法也是没问题的,不过对于数数这种事而言必要性不大。
回复 支持 反对

使用道具 举报

发表于 2025-6-12 18:34 | 显示全部楼层

这东西叫种子计数器,一次能数200粒。
一袋米的数量大概10万左右,需要数500次就差不多了。
按10秒一次,大概一个半小时就数完了。
当然多买几个,多找几个人数可以更快。
回复 支持 反对

使用道具 举报

发表于 2025-6-12 18:34 | 显示全部楼层
正确的方法肯定是偷偷藏起一粒米,然后回答奇数让提问者数。
数出来奇数ok,数出来偶数就拿出你那粒。

但是提问者会上知乎提问,难免会看到这个方法。聪明点的话提问者会偷偷藏起一粒米,等你拿出你的那粒以后他再拿出来,这时候你手中没米,尴尬了。

所以更正确的做法是你偷偷藏起两粒米,
你先拿出一粒,ta再拿出一粒,你最后拿出一粒。
但是提问者会上知乎,他也可能会偷偷藏起两粒米。

所以更正确的做法是你偷偷藏起三粒米,
但提问者会上知乎,也会藏起三粒米,
所以更正确的做法是你偷偷藏起四粒米,
但提问者会上知乎,也会藏起四粒米,
所以更正确的做法是你偷偷藏起五粒米,
但提问者会上知乎,也会藏起五粒米,
所以更正确的做法是你偷偷藏起六粒米,
但提问者会上知乎,也会藏起六粒米,






所以最正确的做法应该是你偷偷藏起半袋米,提问者藏起另外半袋,
这个问题就上升到————谁先手藏米。
理论上米最早是提问者提供的,提问者拥有先手权,
假设提问者是个理性人,他偷偷先藏起一半的米,
你后手至少要留一颗米表示你没有藏米。
那么如果米数是偶数2n,提问者藏起n你藏起n-1,你输,
如果米是奇数2n+1,提问者藏n+1你只能藏n-1,你输,
所以常规解法提问者先手你必输。
这时候你需要引进更加隐秘的掰碎米粒的系统,把一粒米掰成/切成两瓣三瓣四瓣,但提问者会上知乎,易得提问者先手米多,掰米大赛提问者必胜。
这时候
你可以考虑
1,引进更加强硬的吃米系统,当场把米吃下去“现在它是奇数了”,但提问者会上知乎,你们可能要拼一下先手和吃生米的速度。但是如果你们要脸,应该会最后留下至少一粒米————这就是为什么最初要说是奇数。
2,引进更加狡猾的逗你玩系统,既然后手必输,那只藏一粒米足够,如果是偶数就拿出一粒米说你藏了一粒确实是奇数,如果提问者也拿出他的一粒米,你就说“逗你玩的,我那粒其实是我自带的”,但是如果提问者上了知乎也会使用这招“逗你玩的,我这粒也是自带的”,亦或是拿出他的第二粒米,你都可以用“刚才还是逗你玩的,其实这确实是我藏起来的”,只需要两个句式反复横跳,就可以保证你至少立于不败之地。
回复 支持 反对

使用道具 举报

发表于 2025-6-12 18:35 | 显示全部楼层
看来知乎里搞工程的人不多。。。整点专业的给你们看看:


把米从红色箭头的地方倒进去,里面有振动喂料器,可以把米振动下落。在下落过程中,有三台线扫相机给米拍照,不但能知道多少粒,还能给米做个用户画像。


想问下答主,这算不算自动化工程?
回复 支持 反对

使用道具 举报

发表于 2025-6-12 18:36 | 显示全部楼层
拿一颗米切成两半,然后随便说奇数或者偶数就行了
如果对了就没事,如果错了,就说“它们本来是一颗的”
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录 手机动态码快速登录

本版积分规则

关闭

官方推荐 上一条 /3 下一条

快速回复 返回列表 客服中心 搜索 官方QQ群 洽谈合作
快速回复返回顶部 返回列表