สุ่มตัวเลขออกมา 5 ตัวใ้ห้รวมกันได้ 500 พอดี

เริ่มโดย hurahura, 07 มีนาคม 2012, 18:24:01

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

hurahura

ต้องการสุ่มตัวเลขออกมา 5 ตัว แต่ละตัวมีค่าไม่เกิน 200 และทุกตัวรวมกันมีค่า 500 พอดี โดยเลขทั้ง 5 ตัวมีโอกาสเท่ากันที่จะได้ค่ามากหรือน้อย เช่น

str : 200
vit : 100
agi : 50
int : 100
lux : 50

str : 10
vit : 120
agi : 200
int : 180
lux : 90

str : 160
vit : 0
agi : 70
int : 170
lux : 100

จากตัวอย่าง แต่ละชุดเอาเลขมารวมกันได้ 500 พอดี แต่ละตัวไม่เกิน 200 และไม่ต่ำกว่า 0
เขียนแบบไหนถึงจะดีที่สุดครับ ขอบคุณครับ


seoโออิชิ

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


เช่นครั้งแรกสุ่มได้ 10 ก็นำ 490 หารด้วย 4 (จำนวนครั้ง)ที่เหลือ ได้ 122.5 ถือว่าผ่านสุ่มตัวที่ 2 ต่อเลย
ตัวที่ 2 สมมุติได้ 20 ก็ได้ 470 หาร 3 (จำนวนครั้งที่เหลือ) ได้ 156 ถือว่าผ่านสุ่มต่อตัวที่  3
ตัวที่ 3 เจ้ากรรมได้ 30 ทีนี้จะเป็น 440 หารด้วย 2 ทีนี้หละเกิน200แล้ว ให้สุ่มตัวที่ 3 มาใหม่
ตัวที่5 สุดท้ายคงไม่ต้องสุ่มใช้ลบที่เหลือเอาเลย

[direct=http://].[/direct] [direct=http://].[/direct] ช้า ๆ ได้พร้าเล่มงาม เร็ว ๆ ได้พร้าอย่างงาม 2 เล่ม [direct=http://].[/direct] [direct=http://].[/direct][direct=http://].[/direct]

mukemgiz

ต้องดูด้วยเราเล่นสายอาชีพอะไร ถ้า warrior เน้น  str ไปโลด  :wanwan004: :wanwan004: :wanwan004:

seoโออิชิ

อ้างถึงจาก: mukemgiz ใน 07 มีนาคม 2012, 19:01:22
ต้องดูด้วยเราเล่นสายอาชีพอะไร ถ้า warrior เน้น  str ไปโลด  :wanwan004: :wanwan004: :wanwan004:
เล่นซ๊ะงงเลย นั่งนึกตั้งนาน  :wanwan024:
[direct=http://].[/direct] [direct=http://].[/direct] ช้า ๆ ได้พร้าเล่มงาม เร็ว ๆ ได้พร้าอย่างงาม 2 เล่ม [direct=http://].[/direct] [direct=http://].[/direct][direct=http://].[/direct]

Extra Cash

สุ่มมาแค่ 4 ตัวพอครับ
ตัวที่ 5 เอาผลรวมของ 4 ตัวแรกไปลบ 500

[direct=http://www.prodipper.com]PRO DIPPER
ตัวแทนจำหน่าย สีลอกได้ Plasti Dip แท้
อย่างเป็นทางการจาก Performix อเมริกา
[/direct]
       [direct=http://www.votejung.com]โหวดจัง
       โปรโมทเว็บไซต์ฟรี![/direct]
       [direct=http://fbfansmaster.com]FB FANS MASTER
       Buy Facebook Likes[/direct]

oDarkIceo

อ้างถึงจาก: seoโออิชิ ใน 07 มีนาคม 2012, 19:32:43
อ้างถึงจาก: mukemgiz ใน 07 มีนาคม 2012, 19:01:22
ต้องดูด้วยเราเล่นสายอาชีพอะไร ถ้า warrior เน้น  str ไปโลด  :wanwan004: :wanwan004: :wanwan004:
เล่นซ๊ะงงเลย นั่งนึกตั้งนาน  :wanwan024:

55555 เลย

077023

dex หายอ่ะ     :-[ :-[ :-[
[direct=http://tokyo-cool.com]Preorder ญี่ปุ่น[/direct]
[direct=http://077023.com]077023[/direct]
[direct=http://tokyo-cool.com]Preorderสิ้นค้าญี่ปุ่น[/direct]
[img=http://www.jangpic.com/test_count_thaiseo.php/[/img]

Haniba55

อ้างถึงจาก: Extra Cash ใน 07 มีนาคม 2012, 20:07:16
สุ่มมาแค่ 4 ตัวพอครับ
ตัวที่ 5 เอาผลรวมของ 4 ตัวแรกไปลบ 500


ถ้าแบบนี้ ก็ไม่ได้บางกรณีนะครับ

เช่น สี่ตัวแรกมันสุ่ม   1 1 1 1 (หรือเลขหลักน้อยๆ)
ตัวที่ห้า ที่เอามาลบ ห้าร้อย จะได้เกินสองร้อยแน่นอนครับ


ในความคิดเห็นของผมคิดว่า
A1=ตัวเลขที่1 , A2=ตัวเลขที่2 , A3=ตัวเลขที่3 , A4=ตัวเลขที่4 , A5=ตัวเลขที่ 5

A1=สุ่มค่าระหว่าง 0 ถึง 200
A2=สุ่มค่าระหว่าง 0 ถึง 200
B1=  500-(A1+A2)   //ค่าที่จะได้อยู่ระหว่าง 100 - 500
    ถ้า B1 >= 400 ถ้าใช่
        A3 = สุ่มค่าระหว่าง  198 ถึง 200
        A4 = สุ่มค่าระหว่าง  198 ถึง 199
        A5 = 500 - (A1+A2+A3+A4)

    ถ้า B1 มีค่าระห่าง 300 ถึง 399         ถ้าใช่
        A3 = สุ่มค่าระหว่าง  198 ถึง 200
        A4 = สุ่มค่าระหว่าง  98 ถึง 99
        A5 = 500 - (A1+A2+A3+A4)

    ถ้า B1 มีค่าระห่าง 200 ถึง 299         ถ้าใช่
        A3 = สุ่มค่าระหว่าง  98 ถึง 100
        A4 = สุ่มค่าระหว่าง  98 ถึง 99
        A5 = 500 - (A1+A2+A3+A4)

    ถ้า B1 มีค่าระห่าง 100 ถึง 199         ถ้าใช่
        A3 = สุ่มค่าระหว่าง  99 ถึง 100
        A4 = สุ่มค่าระหว่าง  0  ถึง 98
        A5 = 500 - (A1+A2+A3+A4)


ค่าที่ได้ออกมา อาจจะมีรูปแบบที่ไม่เยอะมากนะครับ
แต่ก็ยังถือว่าพอใช้ได้ 555

hurahura

ตอนนี้วิธีของคุณ seoโออิชิ ดีที่สุด ผมลองทำดูแล้ว แต่ต้องเพิ่มนู่นนี่อีกนิด
ขอบคุณ Haniba55 ก็น่าจะโอเค ผมยังไม่ได้ลองทำนะ แต่คิดว่า มันอาจจะไม่ค่อยเท่าเทียมกันแต่ละตัวหรือเปล่า
ตามโจทย์คือ "โดยเลขทั้ง 5 ตัวมีโอกาสเท่ากันที่จะได้ค่ามากหรือน้อย"

ยังรอแนวคิดของท่านอื่นๆอยู่นะครับ

seoโออิชิ

อ้างถึงจาก: Haniba55 ใน 07 มีนาคม 2012, 21:38:41
อ้างถึงจาก: Extra Cash ใน 07 มีนาคม 2012, 20:07:16
สุ่มมาแค่ 4 ตัวพอครับ
ตัวที่ 5 เอาผลรวมของ 4 ตัวแรกไปลบ 500


ถ้าแบบนี้ ก็ไม่ได้บางกรณีนะครับ

เช่น สี่ตัวแรกมันสุ่ม   1 1 1 1 (หรือเลขหลักน้อยๆ)
ตัวที่ห้า ที่เอามาลบ ห้าร้อย จะได้เกินสองร้อยแน่นอนครับ


ในความคิดเห็นของผมคิดว่า
A1=ตัวเลขที่1 , A2=ตัวเลขที่2 , A3=ตัวเลขที่3 , A4=ตัวเลขที่4 , A5=ตัวเลขที่ 5

A1=สุ่มค่าระหว่าง 0 ถึง 200
A2=สุ่มค่าระหว่าง 0 ถึง 200
B1=  500-(A1+A2)   //ค่าที่จะได้อยู่ระหว่าง 100 - 500
    ถ้า B1 >= 400 ถ้าใช่
        A3 = สุ่มค่าระหว่าง  198 ถึง 200
        A4 = สุ่มค่าระหว่าง  198 ถึง 199
        A5 = 500 - (A1+A2+A3+A4)

    ถ้า B1 มีค่าระห่าง 300 ถึง 399         ถ้าใช่
        A3 = สุ่มค่าระหว่าง  198 ถึง 200
        A4 = สุ่มค่าระหว่าง  98 ถึง 99
        A5 = 500 - (A1+A2+A3+A4)

    ถ้า B1 มีค่าระห่าง 200 ถึง 299         ถ้าใช่
        A3 = สุ่มค่าระหว่าง  98 ถึง 100
        A4 = สุ่มค่าระหว่าง  98 ถึง 99
        A5 = 500 - (A1+A2+A3+A4)

    ถ้า B1 มีค่าระห่าง 100 ถึง 199         ถ้าใช่
        A3 = สุ่มค่าระหว่าง  99 ถึง 100
        A4 = สุ่มค่าระหว่าง  0  ถึง 98
        A5 = 500 - (A1+A2+A3+A4)


ค่าที่ได้ออกมา อาจจะมีรูปแบบที่ไม่เยอะมากนะครับ
แต่ก็ยังถือว่าพอใช้ได้ 555
ค่าที่ได้ไม่หลากหลายก็จริงแต่การเขียนแบบนี้โปรแกรมจะทำงานเร็วกว่าแบบที่ผมตอบเล่น ๆ หลายเท่าตัว
[direct=http://].[/direct] [direct=http://].[/direct] ช้า ๆ ได้พร้าเล่มงาม เร็ว ๆ ได้พร้าอย่างงาม 2 เล่ม [direct=http://].[/direct] [direct=http://].[/direct][direct=http://].[/direct]

hurahura

เอ... มันเร็วกว่าจริงๆเหรอครับ

เดี๋ยวต้องลองไปเทียบดู

dreamer

ผมลองเขียน code เป็นภาษา php
ลองรันหลายรอบก็ถูกนะครับ
วิธีการก็ตาม code เลยครับ

----
แก้ไข : เพิ่งย้อนกลับไปอ่าน วิธีการของผมคล้ายกับของคุณ Haniba55 แต่ทำให้เป็น general กว่าครับ

----------------------

<?php
$max_index 5;
$max_value 200;
$min_value 0;
$total 500;

$values = array();
for($n 1$n <= ($max_index-1); $n++)
{
$sum_before 0;
for($o 1$o $n$o++)
{
$sum_before += $values[$o];
}

#min value for random
$min $total $sum_before - (($max_index $n) * $max_value);
if($min $min_value)
{
$min $min_value;
}

#max value for random
$max $total $sum_before;
if($max $max_value)
{
$max =$max_value;
}

$values[$n] = rand($min$max);
}

$sum_before 0;
for($o 1$o $max_index$o++)
{
$sum_before += $values[$o];
}
$values[$max_index] = $total $sum_before;

print "<pre>";
print_r($values);
print "</pre>";

$sum 0;
foreach($values as $value)
{
$sum += $value;
}

print "total is : $sum";

?>



Splendith

ขอลองเสนอวิธีผมมั่งครับ โดยการคำนวณช่วงที่สามารถสุ่มได้ก่อน แล้วจึงค่อยสุ่ม
เนื่องจากโค้ดไม่มี loop การทำงานน่าจะถือว่าไวแล้วนะครับ
และเท่าที่ผมเช็ค ค่าที่ออกมาก็น่าจะเป็นไปได้ทุกกรณี อัตราออกทั้ง 5 น่าจะเท่าเทียมกันนะครับ

ปล. เอาไปตรวจสอบอีกทีด้วยนะครับผม อาจบั๊ก *0* (แต่ผมก็ลองดูหลายรอบละนา)


<?php 
function 
check1($a$b)
{
return $a>$b?$a:$b;
}
function check2($a$b)
{
return $a>$b?$b:$a;
}

$s = array();

$s[0] = rand(0200);
$s[1] = rand(0200);
$tmp check1(100-$s[0]-$s[1], 0);
$s[2] = rand($tmpcheck2(500-$s[0]-$s[1], 200));
$tmp check1(300-$s[0]-$s[1]-$s[2], 0);
$s[3] = rand($tmpcheck2(500-$s[0]-$s[1]-$s[2], 200));
$s[4] = 500-$s[0]-$s[1]-$s[2]-$s[3];

// เพื่อความชัวร์ในความเท่าเทียม ให้เปิดด้านล่างเพื่อเปิดการสุ่มสลับตำแหน่งทั้งหมดใน Array โดยส่วนตัวผมคิดว่าไม่จำเป็นนะ (เพราะการสุ่มตั้งแต่แรกมันก็น่าจะเท่าเทียมพอ)
// shuffle($s)

echo "$s[0] $s[1] $s[2] $s[3] $s[4] = " . ($s[0] + $s[1] + $s[2] + $s[3] + $s[4]);
?>


[direct=http://www.golity.com]Golity - บล็อกพาชมภาพเที่ยว ที่พัก กิน ไปแล้วดี มีบอกต่อ[/direct]

NightClub

ถ้าจะให้เท่าเทียมกันจริง ต้องมีการสลับค่าการเรียง str agi vit dex ก่อนหลังด้วยครับ แล้วค่อยเอามาเข้าสูตร

จากนั้นทุกอัน ทำการ แรนดอม 0,1000 แล้วนำมาเทียบอัตราส่วนกันอีกทีครับ โดยตั้งที่ผลรวมของทุกค่า แล้วหาร 5 แล้วเทียบเปอเซน

พวกเศษที่เกินมา ให้วน + 1 ตามการเรียงในขั้นต้น

รับจ้างเขียนโปรแกรม PHP งานมืออาชีพ เสร็จตามที่กำหนด ราคาปานกลาง
เหมาะกับผู้ที่รับงานมาแล้วส่งต่อจ๊ะ PM มาเลย

powerbeer001

สุ่มมา 4 ตัวก่อน แล้วตัวที่ 5 เอาส่วนต่าง

เข่น

r1=ramdom(500);
r2=ramdom(500);
r3=ramdom(500);
r4=ramdom(500)
r5=(r1+r2+r3+r4+)-500;
อ้างถึง
[direct=https://www.examvify.com] ระบบฐานข้อมูลข้อสอบและห้องสอบออนไลน์ฟรี [/direct]

อ้างถึง
[direct=https://www.posvis.com] โปรแกรมบริหารร้านค้า POS ฟรี [/direct]

dreamer

อ้างถึงจาก: powerbeer001 ใน 08 มีนาคม 2012, 07:07:33
สุ่มมา 4 ตัวก่อน แล้วตัวที่ 5 เอาส่วนต่าง

เข่น

r1=ramdom(500);
r2=ramdom(500);
r3=ramdom(500);
r4=ramdom(500)
r5=(r1+r2+r3+r4+)-500;


กรณีที่ r1 = r2 =r3 = 0 คำตอบจะไม่ถูกต้องครับ

few_wer

ลองให้ random ตัวเลขเก็บลง a,b,c,d,e แล้วก็เอามาบวกกันก่อน แล้วเก็บไว้ใน sum แล้วก็เอา sum ไปเทียบเอาก็ได้มั้ง

sum=a+b+c+d+e;

แล้วก็ใช้ while(sum=500){
if(sum มากกว่า 500){a--;b--;c--......}
else if(sum น้อยกว่า 500){a++;b++;c++....}

sum=a+b+c+d+e;

}
.
.
.

ประมาณนี้ก็ได้ล่ะมั้ง
ถูกเปล่าไม่รู้ เอิ้กๆ
Host Gator
Baby plan 0.01 US คูปองโดนๆ "welovenayloung"
ลด 25% คูปองโดนๆอีก "PomRukNayLoung"

MeenyFancy

โจทย์ง่ายๆ อย่าคิดเยอะครับ

<?php
$max 
500;
$rv 200;
if(
$max $rv$mxx $rv;

$a rand(0,$mxx);
$max $max-$a;

if(
$max $rv$mxx $rv;
$b rand(0,$mxx);
$max $max-$b;

if(
$max $rv$mxx $rv;
$c rand(0,$mxx);
$max $max-$c;

if(
$max $rv$mxx $rv;
$d rand(0,$mxx);
$max $max-$d;

$e $max;

echo 
$a" : "$b" : "$c" : "$d" : "$e;
?>

Have a good trip.
[direct=http://petdeecare.com]สุนัขป่วย[/direct] [direct=http://petdeecare.com]แมวป่วย[/direct]
[direct=http://petdeecare.com]หนูป่วย[/direct] [direct=http://petdeecare.com]อาหารแมว[/direct] [direct=http://petdeecare.com]อาหารหมา[/direct]

dreamer

อ้างถึงจาก: MeenyFancy ใน 08 มีนาคม 2012, 08:14:58
โจทย์ง่ายๆ อย่าคิดเยอะครับ

<?php
$max 
500;
$rv 200;
if(
$max $rv$mxx $rv;

$a rand(0,$mxx);
$max $max-$a;

if(
$max $rv$mxx $rv;
$b rand(0,$mxx);
$max $max-$b;

if(
$max $rv$mxx $rv;
$c rand(0,$mxx);
$max $max-$c;

if(
$max $rv$mxx $rv;
$d rand(0,$mxx);
$max $max-$d;

$e $max;

echo 
$a" : "$b" : "$c" : "$d" : "$e;
?>



-----
ผมลอง run ดู เจอ case ที่ไม่ถูกต้องครับ

170 : 187 : 112 : 63 : -32

200 : 172 : 4 : 139 : -15

176 : 195 : 172 : 67 : -110

196 : 19 : 191 : 159 : -65

MeenyFancy

ขอบคุณครับ เวอชั่นแก้บัก

<?php
for ($i=0$i<=100$i++){
$e 255;
while($e>200) {
$max 500;
$rv 200;
if($max $rv) { $mxx $rv; } else {$mxx $max; }
$a rand(0,$mxx);
$max $max-$a;

if($max $rv) { $mxx $rv; } else {$mxx $max; }
$b rand(0,$mxx);
$max $max-$b;

if($max $rv) { $mxx $rv; } else {$mxx $max; }
$c rand(0,$mxx);
$max $max-$c;

if($max $rv) { $mxx $rv; } else {$mxx $max; }
$d rand(0,$mxx);
$max $max-$d;
$e $max;
}
echo $a" : "$b" : "$c" : "$d" : "$e "<br>";
}
?>

Have a good trip.
[direct=http://petdeecare.com]สุนัขป่วย[/direct] [direct=http://petdeecare.com]แมวป่วย[/direct]
[direct=http://petdeecare.com]หนูป่วย[/direct] [direct=http://petdeecare.com]อาหารแมว[/direct] [direct=http://petdeecare.com]อาหารหมา[/direct]

seoโออิชิ

เขียนสั้นสุด ง่ายสุด แต่โปรแกรมทำงานนานสุด

ตั้งค่า ตัวแปล 5 ตัว a,b,c,d,e = 0-200
แล้วให้มัน แรนด้อม ไปเลย ผลลับออกมาได้เท่าไหร่นำมาบวกกันถ้าไม่เท่ากับ 500 ให้แรนด้อมใหม่ทั้งหมด ถ้าเท่ากับ 500 สั่ง print
ถ้าเทียบกับของผมอันบน
แล้วแต่ ความต้องการครับว่า ต้องการให้เขียนโปรแกรมให้สั้นสุด หรือเขียนให้รันเร็วสุด
แต่แบบนี้กว่าจะได้แต่ล๊ะ case นานกว่ามาก   :wanwan024: :wanwan004:
[direct=http://].[/direct] [direct=http://].[/direct] ช้า ๆ ได้พร้าเล่มงาม เร็ว ๆ ได้พร้าอย่างงาม 2 เล่ม [direct=http://].[/direct] [direct=http://].[/direct][direct=http://].[/direct]

guzzilar

อ้างถึงจาก: seoโออิชิ ใน 08 มีนาคม 2012, 10:28:44
เขียนสั้นสุด ง่ายสุด แต่โปรแกรมทำงานนานสุด

ตั้งค่า ตัวแปล 5 ตัว a,b,c,d,e = 0-200
แล้วให้มัน แรนด้อม ไปเลย ผลลับออกมาได้เท่าไหร่นำมาบวกกันถ้าไม่เท่ากับ 500 ให้แรนด้อมใหม่ทั้งหมด ถ้าเท่ากับ 500 สั่ง print
ถ้าเทียบกับของผมอันบน
แล้วแต่ ความต้องการครับว่า ต้องการให้เขียนโปรแกรมให้สั้นสุด หรือเขียนให้รันเร็วสุด
แต่แบบนี้กว่าจะได้แต่ล๊ะ case นานกว่ามาก   :wanwan024: :wanwan004:
จัดไป

<?php
do{
   $a   = rand(0,200);
   $b   = rand(0,200);
   $c   = rand(0,200);
   $d   = rand(0,200);
   $e   = rand(0,200);
}while($a+$b+$c+$d+$e != 500);

echo $a.'--'.$b.'--'.$c.'--'.$d.'--'.$e;
echo '<br/>';
echo $a+$b+$c+$d+$e;
?>

:wanwan004: :wanwan004: :wanwan004:
Rest in Home

ahon

<?php

//ลองแบบผมดู

$tmp = array();
$min = 10;
$max = 200;
$max_all = 500;

// res val
$sum= 0;
$max_tmp = 0;

for($i=0;$i<5;$i++){
$tmp[$i]=  rand($min,$max);
}

for($i=0;$i<10;$i++){
  $sum = get_sum($tmp);
  if($sum > $max_all){
     
    $adj = $sum - $max_all ;
     $ik_slot = rand(0,4);
   
     if( $tmp[$ik_slot] - $adj > $min ){
     $tmp[$ik_slot] -= $adj ;
     break;
   
    }else{
         if( $tmp[$ik_slot] - ($adj/2) > $min ){
         $tmp[$ik_slot] -= (int)($adj/2) ;
         break;
          }
     }
     

  }else{//ทำตรงข้ามกับเคสด้านบน


  }

}

// show
var_dump($tmp);

//////////////////////////////////
function get_sum($tmp){
$sum = 0;
  for($i=0;$i<5;$i++){
     $sum += $tmp[$i];
  }
  return $sum;
}


?>
[direct=http://hotelandresortthailand.com]█ โปรโมชั่นโรงแรม By Hotel&Resort █[/direct]
[direct=http://hotelandresortthailand.com/search.php?destination=73]█ รีวิวโรงแรมเชียงใหม่ By Hotel&Resort█[/direct]  จะไปเที่ยวเชียงใหม่ ดูก่อนนะครับ

NightClub

เพิ่งคิดได้เมื่อเช้า เลยมาเสริมนิด

$randomcount = 0;
$status = array('str','agi','vit','int','luk');
for($i=0;$i<500){
$point = rand(0,1);
if($point){ $i = $i+1;}
$status[$randomcount] = $status[$randomcount]+$point;
$randomcount = $randomcount+1;
if($randomcount == count($status)){ $randomcount = 0;}
}


รับจ้างเขียนโปรแกรม PHP งานมืออาชีพ เสร็จตามที่กำหนด ราคาปานกลาง
เหมาะกับผู้ที่รับงานมาแล้วส่งต่อจ๊ะ PM มาเลย