Friday, July 17, 2020

สร้างจำนวนเต็มที่ไม่ซ้ำกัน

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

สมมติเราอยากได้จำนวนเต็มไม่ซ้ำกันภายใน 1 ถึง 1 แสน จำนวนหมื่นตัว ก็สร้างเลขจำนวนเต็มขึ้นมาก่อนด้วยคำสั่ง randi


nid = 1e4;
uid = randi([1,1e5],1,nid);

ทีนี้มันต้องมีเลขที่ซ้ำกันบ้างล่ะ เราก็จะมาคัดเลขออกกัน ถ้าเป็นคนอื่นจะทำยังไง ส่วนใหญ่คงใช้ for loop แต่ไม่เอา เราอยากได้วิธีอื่น ที่คิดขึ้นมาเอง 555


[val,ind] = sort(uid);
dupcheck = find(diff(val)==0);
val(dupcheck) = [];
ind(dupcheck) = [];

อันดับแรก เรียง vector จากจำนวนมากไปน้อยก่อน แล้วก็หาว่าตัวเลขที่อยู่ติดกันเหมือนกันหรือไม่ ด้วยการหา different ใน vector นี้ แล้วหาตำแหน่งที่มีค่าเท่ากับ 0 เพราะตำแหน่งที่มีค่าเท่ากับศูนย์คือตำแหน่งที่ตัวเลขเหมือนกัน หลังจากได้ตำแหน่ง dupcheck มาแล้วก็ไปตัดตัวเลขที่ซ้ำกันออก ใน val และ ind

newid = nan(1,nid);
newid(ind) = uid(ind); 
newid(isnan(newid))=[];
plot(newid,'ob');

หลังจากนั้นสร้างตัวแปรใหม่ newid ขึ้นมา โดยให้มีขนาดเท่ากับ nid แล้วก็ทำการยัดตัวเลขจาก nid เข้า newid โดยตัดตำแหน่งที่ซ้ำกันออก
เท่านี้เราก็จะได้จำนวนเต็มที่ไม่ซ้ำกันแล้ว เพียงแต่วิธีนี้จำกัดจำนวนตัวเลขได้เท่าที่ memory ของ computer จะเก็บ nid ไหว และที่สำคัญมันบอกจำนวนที่จะgenerateออกมาไม่ได้ เช่นถ้าบอกว่าอยากได้ unique number 9000 ตัว ไรงี้ ก็จะทำให้ไม่ได้ แต่ก็ ไม่เลวร้ายเกินไปสำหรับ quiz ลับสมองนี้ล่ะมั้ง

No comments:

Post a Comment