ใน while loop ใช้ random ไปเรื่อยๆ ถ้าเจอซ้ำให้ random ใหม่ .. แบบนี้มันไม่ค่อยจ๊าบนะครับ ^^
เดี๋ยวต้องให้เหตุผลว่าทำไมผมคิดว่ายังไม่จ๊าบ .. เพราะว่าการ random ใหม่จากค่า max เดิมและตัวที่เลือกไปแล้วยังเกี่ยวข้องอยู่ อาจจะเกิดการ random แบบไม่แฟร์ขึ้นได้ครับ อิอิ
เก็บเลขที่หยิบมาแล้วไว้ใน array ทุกครั้งที่หยิบเอามาเปรียบเทียบกับค่าที่เก็บไว้ถ้าเหมือนซ้ำให้หยิบใหม่ ของซ้ำไม่ต้องแสดงผลออกมา
หรือ
อันไหนที่หยิบออกแล้วให้ unset ค่านั้นออกจาก array 1-10
วิธีที่สองเร็วกว่า
สุ่ม 1-10 เก็บไว้ใน array ก่อน
แล้วตัวต่อไปให้สุ่มมาใส่ตัวแปรไว้ก่อน ตัวแปรอะไรก็ได้
แล้วเอาตัวแปรนั้นไปตรวจกับในarray ว่าซ้ำหรือเปล่า
ถ้าซ้ำวนลูปทำใหม่ ถ้าไม่ซ้ำ เอาค่าไปใส่ array ตัวถัดไป แล้ววนลูป
ทำจนครบ array
สุ่มเลขมาใส่ในเซ็ตจนครบ 5 ตัวครับ
เก็บค่าไว้ใน Array 10 ตัว
random แบบกำหนดให้ไม่เกิน 10 ได้เลขอะไรมา
เอาไปวนลูปใน array ตกตำแหน่งไหนเอาเลขนั้นออกมา
แล้วเอาค่านั้นออกจาก array ด้วย
ทำซ้ำข้อ 2 อีก 4 ครั้ง
ไม่รู้จะพอช่วยได้หรือเปล่าหนอ?
int array = {1,2,....10}
for(int i = 1 ; i <= 5 ; i++)
{
int randomIndex = random(0,array.size);
print("Random number "+i+" : "+array[randomIndex]);
array.remove(randomIndex);
}
import random
i = range(1,10)
random.shuffle(i)
for j in i[0:5]:
print j
ได้ละครับ ขอบคุณมากครับ
แล้วไม่ทราบว่า อาร์เรย์ใน c เราสามารถเอาสมาชิกในอาร์เรย์ออกแล้วปรับค่า index ได้ไหมอะครับ
ไม่ได้ครับ
เอามาจากอัลกอของคนแถวนี้สักคน จำไม่ได้ว่าใคร :P
{syntaxhighlighter class="c"}
srand(time(0));
bool taken[10];
int i = 0;
for(i = 0; i<10; i++)
{
taken[i] = false;
}
int takenCount = 5;
while(takenCount > 0)
{
int random = (rand()*100) % 10;
if(taken[random] == true)
continue;
taken[random] = true;
printf("%d\n", random+1);
takenCount--;
}
{/syntaxhighlighter}
ใน while loop ใช้ random ไปเรื่อยๆ ถ้าเจอซ้ำให้ random ใหม่ .. แบบนี้มันไม่ค่อยจ๊าบนะครับ ^^
เดี๋ยวต้องให้เหตุผลว่าทำไมผมคิดว่ายังไม่จ๊าบ .. เพราะว่าการ random ใหม่จากค่า max เดิมและตัวที่เลือกไปแล้วยังเกี่ยวข้องอยู่ อาจจะเกิดการ random แบบไม่แฟร์ขึ้นได้ครับ อิอิ
ของคุณ narok119 ไช้ cpu น้อย เหมาะสำหรับการสุ่มเลขหลายตัว ที่ค่าสูงสุดไม่มาก
ส่วนข้างบนนี้ ไช้ ram น้อย เหมาะสำหรับการสุ่มเลขไม่กี่ตัว ที่มีค่าสูงสุดมากๆครับ การสุ่มแบบนี้ถือว่าแฟร์นะครับ
samsung ใหญ่แค่ใหน ?
https://youtu.be/6Afpey7Eldo
จริงครับ ผิดหลักสถิติ แต่ถ้าไม่ได้ใช้งานอะไรเชิงวิชาการที่เคี่ยวๆ ก็คงไม่มีปัญหา
อคติทำให้คนรับเหตุผลด้านเดียว
ใน python มีฟังชั่นให้
{syntaxhighlighter class="brush: python"}
import random
sam = range(1, 10)
k = 7
result = random.sample(sam, k)
{/syntaxhighlighter}
Jusci - Google Plus - Twitter
ทำเหมือนสับไพ่ครับ
แล้วหยิบไพ่ 5 ใบแรก แค่นี้ก็ไม่ซ้ำแล้วครับ
โอ้ว ไม่เคยนึกถึงวิธีนี้เลย
ระหว่างอ่านความเห็นอื่นๆ คิดวิธีนี้เหมือนกัน แต่ว่าวิธีเช็คว่าหยิบเลขนั้นไปแล้วน่าจะเร็วกว่า
อย่าให้ต้องคิด Big-O นะ .. อิอิ
(Big-O ใช้สำหรับ การทำวิเคราะห์ประสิทธิภาพของวิธีการ)
pop ข้อมูลที่เลือก
กับ
random ด้วยเวลากับวันที่ครับ ;)
ไพธอน
random.sample(range(1,11),5)
lewcpe.com, @wasonliw