ผมมีข้อมูลสองชุด ชุดละ 20 ตัว ต้องการจับคู่แบบสุ่มไม่ซ้ำดังนี้
ชุดที่หนึ่ง (ยึดชุดนี้เป็นหลัก)
A1 ถึง A20
ชุดที่สอง
B1 ถึง B20
มีการจับคู่ประมาณนี้
หาก A1 สุ่มจับคู่ได้ B12 แล้ว
A2 ถึง A20 จะไม่สามารถจับคู่กับ B12 ได้อีกแล้ว
ผมคิดเลขมั่วๆ แบบเบื้องต้น
ชุด A จะจับคู่แบบสุ่มได้ A ละ 5B
งงมั้ยครับ
ภาษาอะไรก็ได้ครับ วิธีคิดก็ได้ครับ
C#,Java,PHP,C,C++
import
phutsa Fri, 30/03/2012 - 23:10
import java.util.ArrayList;
import java.util.LinkedList;
public class randomA1_A20 {
// a[i-1] = "A"+i;
// b[i-1] = "B"+i;
a.add("A"+i);
b.add("B"+i);
}
// System.out.println(random);
keepB.add(b.get(random));
b.remove(random);
j++;
}
// System.out.println(keepB.toString());
for (int i = 0; i < a.size(); i++) {
System.out.println(keepA.get(i)+" = "+keepB.get(i));
}
}
public static void main(String[] args) {
new randomA1_A20();
}
}
/* output ประมาณนี้ครับ ไม่รู้จะใช่ไหม ลองทำเล่น ๆ ดูครับ
A1 = B11
A2 = B15
A3 = B4
A4 = B1
A5 = B9
A6 = B17
A7 = B19
A8 = B16
A9 = B2
A10 = B3
A11 = B6
A12 = B14
A13 = B20
A14 = B7
A15 = B8
A16 = B10
A17 = B13
A18 = B18
A19 = B12
A20 = B5
แนวคิด random ไมซ้ำของจาวานะครับ
credit AJ. Prymania
*/
class MyData{ public String
chatcharin Fri, 30/03/2012 - 23:13
class MyData{
public String name;
public MyData relation;
public setName(String name){
this.name = name;
}
public void setRelation(MyData re){
this.relation = re;
re.relation = this;
}
public boolean getStatus(){
return relation==null;
}
public void showRelation(){
System.out.println(this.name+" relation "+relation.name);
}
}
main method
Mydata A[] = new MyData[20];
Mydata B[] = new MyData[20];
for(int i=0;i<20;i++){
A[i].setName("A"+i);
B[i].setName("B"+i);
}
public int getRandom(){
int x = 0;
while(true){
x ++;
int i = (int) ( Math.random()*20)+1;
if(B[i].getStatus())
return i;
if(x > 1000) return 0;
}
}
for(int i=0;i<20;i++){
A[i].setRelation(B[getRandom()]);
A[i].showRelation();
}
คร่าวๆ นะครับ สดๆ เลย
โอ้ว ขอบคุณมากคร้าบบบบบ
nevermore Sat, 31/03/2012 - 02:48
โอ้ว ขอบคุณมากคร้าบบบบบ
ง่ายๆ
neizod Sat, 31/03/2012 - 11:22
ง่ายๆ เลยก็สลับสมารชิกในตัวแปรชุด B ให้เรียบร้อยซะ แล้วค่อยเอา A มาจับคู่กับ B
{syntaxhighlighter class="brush: python"}
import random
A = list(range(1, 21))
B = list(range(1, 21))
random.shuffle(B)
for a, b in zip(A, B):
print('A = ', a, '& B = ', b)
{/syntaxhighlighter}
ไม่ค่อยถนัด Python แต่ดู Code
PiKO Sat, 31/03/2012 - 23:45
In reply to ง่ายๆ by neizod
ไม่ค่อยถนัด Python แต่ดู Code นี้แล้วก็รู้สึก Python มันสะดวกดีจัง :D
การสุ่มแบบไม่ซ้ำนั้น
heart Sat, 31/03/2012 - 22:19
การสุ่มแบบไม่ซ้ำนั้น ใช้หลักการง่ายๆก็ได้ เช่นเดียวกับการหยิบส้ม ออกจากกล่อง
หากส้มลูกที่ถูกสุ่มหยิบออกมาแล้ว เราจะไม่มีทางหยิบได้ลูกเดิมแน่นอน เพราะว่าในกล่อง คงไม่มีส้มลูกเดิม ถึง 2 ลูก
(ยกเว้นอีกลูกจะทะลุมาจากมิติคู่ขนาน)
ดังนั้นหากจะให้ array A และ B จับคู่กันโดยไม่ซ้ำ
เราก็สามารถสุ่ม A และ B อย่างละตัว และลบค่านั้นออกจาก array เดิมไป
แค่นี้ เราก็จะไม่มีทางสุ่มได้ค่าเดิมอีก เพราะใน array นั้นไม่มีค่าเดิมอีกต่อไปแล้ว
แนวคิดนี้สามารถประยุกต์ใช้ในแบบอื่นได้เช่น หากเราไม่ต้องการไปแก้ไข Array A และ B เราก็ยังสามารถสร้าง
Array อีกชุดหนึ่ง ซึ่งใช้บอกตำแหน่งที่จับคู่กัน เราก็จะแรนดอมได้เป็น ตำแหน่ง A และ B โดยที่ไม่ต้องแตะต้อง Array A,B เลยด้วยซ้ำ
แต่วิธีของคุณ neizod นี่เจ๋งกว่า เพราะแค่สลับก็พอ
ซึ่งหากว่าไม่อยากไปสลับ Array จริงก็ใช้ Array เลขลำดับแบบที่บอกก็ยังได้
B1 เลือกจับคู่กับชุด A ได้ 20
Invisible Force Mon, 02/04/2012 - 15:51
มีปัญหาอีกแล้วครับ คือ
nevermore Mon, 02/04/2012 - 17:12
มีปัญหาอีกแล้วครับ
คือ การแทนที่คำ ปกติเราใช้ str_replace ไม่ก็ preg_replace
$string_replace = array("PHP","PHP","PHP");
$string = "PHP and PHP and PHP";
ต้องการ Output มาเป็น
$string = "PHP and PHP and PHP";
แต่ที่ได้มามันเป็น
$string = "PHP and PHP and PHP";
คือมันแทนที่ทุกคำไปเลยอ่ะครับ
เช่น
$string_replace = array("array ","array ","array ");
หาวิธียังไม่ได้เลย T_T
preg_replace_callback() คือคำ
nevermore Mon, 02/04/2012 - 18:25
In reply to มีปัญหาอีกแล้วครับ คือ by nevermore
preg_replace_callback()
คือคำตอบหรือปล่าว ??????
อ่านแล้วยังงงๆ
http://www.php.net/manual/en/function.preg-replace-callback.php
EDIT : ได้แล้วครับ