คนรู้จักแทงบน 3 ตัวตรง แต่ลืมกลับเลขเลยถูกกิน 
Tags: php, probability, พีชคณิต, ไทย
Published: 2019-07-11 02:11:09

---
title: คนรู้จักแทงบน 3 ตัวตรง แต่ลืมกลับเลขเลยถูกกิน 
published: true
description: ได้ยินพี่คนหนึ่งบ่นเรื่องตัวเลข ว่าลืมกลับเลขตอนซื้อหวย สงสารเขา อุตส่าห์จะมีโชค แต่พลาดแค่นิดเดียว เลยเป็นแรงบันดาลใจในการเขียนฟังก์ชั่นกลับเลข 2ตัวและ3ตัว
tags: php, probability, พีชคณิต, ไทย
cover_image: https://thepracticaldev.s3.amazonaws.com/i/urjfwwk9qscc7sx1dpva.jpg
---

# เสี่ยงโชค

"โชคร้ายพี่ลืมกลับเลข ไม่งั้นล่ะก็นะ~~~~" เสียงบ่นจากพี่ที่ผมรู้จัก ซึ่งเป็นเหมือนคำพูดติดปากของแกในทุกวันที่ 1 และวันที่ 16 ของทุกเดือน เอาล่ะครับผมว่าหลายคนก็พอที่จะเดาออกว่ามันเป็นคำบ่นเกี่ยวกับเรื่องอะไรใช่ไหมครับ😂 พี่แกเล่นทียาวเป็นหางว่าวเลย🤭 

ในใจผมก็คิดไปหลายอย่าง ไม่ว่าจะเป็นสงสารที่แกเฉียดตลอดไม่โดนเต็มๆ สักทีจะมีก็แต่ถูกเขากิน แต่อีกใจก็คิดว่าพี่ไม่น่าเล่นเลยเสียดายตังค์เปอร์เซ็นถูกมันน้อย ผมว่าเล่นหุ้นยังจะดูมีลุ้นมากกว่าเพราะ อย่างน้อยๆ ก็มีข้อมูลให้เราได้เลือกตัดสินใจ

แต่สิ่งนี้ก็เหมือนจะเป็นส่วนหนึ่งของสังคมบ้านเราไปเสียแล้ว และผมก็เชื่อด้วยว่าทั่วโลกก็เล่นกัน สำหรับผมนานๆ ทีก็มีซื้อสลากกินแบ่งรัฐบาลบ้าง เอาไว้ให้ได้ฝันดีก่อนวันประกาศผล เอาไว้คุยกับครอบครัวว่าจะเอาเงินไปทำอะไรบ้าง ให้ได้พอยิ้มกัน

## สร้างฟังก์ชั่นแก้ปัญหา

เมื่อผมมองว่ามันเป็นปัญหาที่หลายคนน่าจะเคยเจอเหมือนๆ กัน ผมเลยเอามันมาแปลงเป็นโจทย์เพื่อ exercise ตัวเองสักหน่อย 

วันนี้เราจะมาลองสร้าง ฟังก์ชั่นความน่าจะเป็น สำหรับเลขท้าย 2 ตัวและ 3 ตัวกัน โดยจะใช้หลัก **ความน่าจะเป็น** 

**ตัวอย่าง** สมมุติว่าพี่เขาทำการซื้อเลข 2 ตัว คือ **12** โดยมากแล้วคนส่วนใหญ่จะซื้อเลขกลับด้วย ซึ่งนั่นก็คือ **21** ดังนั้น สรุปได้ว่าเมื่อพี่เขามีเลข 2 ตัวที่ชอบอยู่แล้ว พี่เขาก็มักจะซื้อเลขกลับด้วย ดังนั้นพี่เขาก็จะทำการซื้อเลข **12** และ **21**

เข้าใจง่ายใช่ไหมครับ แต่ถ้ามันเป็นเลข 3 ตัวล่ะ และในกรณีที่พี่เขาไม่ได้ซื้อเลขโต๊ด แล้วเลขที่พี่เขาซื้อมันออกรางวัลด้วยเพียงแต่พี่เขาไม่ถูกเพราะเลขที่ออกกับเลขที่พี่เขาซื้อมันสลับตำแหน่งกันล่ะ!! เฮ้อ~ มันก็คงจะวนเข้าลูปเดิมเช่นเคย คือ บ่นว่าเฉียดแค่นิดเดียว แต่ถ้าพี่เขาไล่ซื้อเลขกลับของ เลข 3 ตัวทั้งหมดไปแล้วถึงแม้ว่ามันไม่ถูกมันก็อาจไม่ทำให้พี่เขารู้เสียดาย เพราะอย่างไรเสียพี่แกก็เล่นซื้อยาวเป็นหางว่าวอยู่แล้ว🤭

### โจทย์ 👩‍🏫

ดังนั้น เราก็จะได้โจทย์ในการ exersice คือ จงสร้างฟังก์ชั่นสำหรับกลับเลข 2 สองตัว และเลข 3 ตัว เพื่อหาชุดเลขจากความน่าจะเป็นทั้งหมด เพื่อที่ว่าพี่เขาจะได้ไม่ต้องมานั่งเสียใจทีหลัง เมื่อเลขที่พี่เขาซื้อมันเฉียดแต่ไม่ถูกรางวัล

**ตัวอย่าง** พี่เขาได้เลย เด็ด 2 ตัว และ 3 ตัว มาจากการไปถูกต้นไม้ศักดิ์สิทมาจากวัดนั่งเทียน จังหวัด เขียนเอา โดยที่เลข 2 ตัวที่ได้มาจากการโรยแป้งและถูต้นไม้ พี่เขาเห็นเป็นเลข 64 และเลข 639 งวดนี้พี่เขาเห็นได้อย่างชัดเจนอย่างที่ไม่เคยเป็นมาก่อน ดังนั้นพี่เขามั่นใจว่าต้องถูกแน่นวล~ แต่ด้วยความที่เราเป็นห่วงพี่ ดังนั้นเราเลยต้องเขียนฟังก์ชั่นเพื่อช่วยกลับเลขที่พี่เขาไปได้มาดังนี้

> ต้องขอขอบคุณ [Permutations - all possible sets of numbers](https://stackoverflow.com/questions/5506888/permutations-all-possible-sets-of-numbers)

```php
<?php

    function pc_permute(array $items, array $perms = [ ])
    {
        if (empty($items)) {
            $return = [$perms];
        } else {
            $return = [];
            for ($i = count($items) - 1; $i >= 0; --$i) {
                $newitems = $items;
                $newperms = $perms;
                list($foo) = array_splice($newitems, $i, 1);
                array_unshift($newperms, $foo);
                $return = array_merge($return, pc_permute($newitems, $newperms));
            }
        }

        return $return;
    }

```

สำหรับโค้ดตัวด้านบนนั้นเป็นฟังก์ชั่นที่เอาไว้สำหรับหา ชุดตัวเลขที่เป็นไปได้ทั้งหมด จากตัวเลขเด็ดที่เราได้มา โดยจะรับค่าในรูปแบบ อาเรย์ ในชื่อ `$item` ส่วน `$perms` ให้ปล่อยว่างไว้ เพราะมันเอาไว้ใช้สำหรับการเรียงสลับชุดตัวเลขที่เราจะทำการค้นหาความเป็นไปได้

```php
<?php

    function all_possibility($number)
    {
        $digits = pc_permute(str_split($number));
        $result = [];

        foreach ($digits as $data) {
            $result[] = (int) implode("", $data);
        }

        $result = array_unique($result);
        sort($result);

        return $result;
    }
```

เราสร้างฟังก์ชั่นอีกฟังก์ชั่นหนึ่งขึ้นมาเพื่อจัดการข้อมูล input และ output และเพื่อให้ง่ายต่อการป้อนข้อมูล เพราะฟังก์ชั่น `pc_permute` ของเรานั้นรับค่าเป็น อาเรย์ ในการค้นหาค่าที่เป็นไปได้ทั้งหมดและคืนค่าออกมาในรูปแบบอาเรย์ ที่ย่อยตัวเลขออกเป็นชั้นๆอีกที ถ้าหากสงสัยหรือนึกภาพไม่ออก ก็ลองเอาฟังก์ชั่น `pc_permute` ไปรันเพื่อดูผลลัพธ์ก่อนได้ครับ 

เท่านี้เราก็จะได้ฟังก์ชั่นหาค่าที่เป็นไปได้จากการสลับตำแหน่งไปมาของเลขเด็ดที่เราได้มาแล้วครับ ฟังก์ชั่นตัวนี้เป็นการหาค่าความน่าจะเป็นทั้งหมดของตัวเลขที่เราป้อนเข้าไป แต่สิ่งที่ผมต้องการคือแค่หาค่าของเลขสามตัว เพราะเลขสองตัวเราก็สามารถกลับเลขได้เองง่ายๆ อยู่แล้วใช่ไหมล่ะครับ แต่ถ้าเป็นเลขสามตัวก็อาจต้องใช้กระดาษหรือเวลาเพิ่มขึ้นหน่อย แต่เมื่อมีฟังก์ชั่นนี้ก็จะทำให้การซื้อเลขของคุณง่ายมากยิ่งขึ้นครับ

### ทดสอบกับเลข 2 ตัว ที่พี่เขาไปได้มาจากต้นไม้ศักดิ์สิทธิ์

```php
// เมื่อเราทำการรันเลข 64
all_possibility(64);

// ผลลัพธ์ที่ได้ก็จะเป็น
array:2 [
  0 => 46
  1 => 64
]
```

### ทดสอบกับเลข 3 ตัว ที่พี่เขาไปได้มาจากต้นไม้ศักดิ์สิทธิ์

```php
// เมื่อเราทำการรันเลข 639
all_possibility(639);

// ผลลัพธ์ที่ได้ก็จะเป็น
array:6 [
  0 => 369
  1 => 396
  2 => 639
  3 => 693
  4 => 936
  5 => 963
]
```

คราวนี้ถ้าเลขมันออกตามที่พี่เขาซื้อไว้เพียงแต่มันสลับตำแหน่งกัน พี่เขาก็จะได้เต็มๆ (บางคนคงสงสัยว่าทำไมไม่โต๊ด เอาเป็นว่าพี่เขาไม่ชอบซื้อโต๊ดก็แล้วกันครับ) ดังนั้นจึงสรุปได้ว่าพี่เขาอาจไม่ต้องมานั่งเสียใจ และเสียโอกาสในการเป็นเศรษฐีในงวดที่กำลังจะมาถึงนี้นั่นเอง 

จบแล้วครับ