Rand () ให้ตัวเลขเดียวกันอีกครั้งสำหรับช่วงขนาดเล็ก


9

ฉันพยายามจัดเรียงเกมที่มีตาราง aa ขนาด 20x20 และฉันแสดงผู้เล่น (P) เป้าหมาย (T) และศัตรูสามคน (X) ทั้งหมดเหล่านี้มี X และ Y rand()ประสานงานที่ได้รับมอบหมายโดยใช้ ปัญหาคือว่าถ้าฉันพยายามที่จะได้รับคะแนนมากขึ้นในเกม (เติมพลังงาน ฯลฯ ) พวกเขาทับซ้อนกับจุดอื่น ๆ หนึ่งหรือมากกว่าเพราะช่วงที่มีขนาดเล็ก (รวม 1 ถึง 20)

นี่คือตัวแปรของฉันและวิธีที่ฉันกำหนดค่า: ( COORDคือstructด้วย x และ a y เพียงอย่างเดียว)

const int gridSize = 20;
COORD player;
COORD target;
COORD enemy1;
COORD enemy2;
COORD enemy3;

//generate player
srand ( time ( NULL ) );
spawn(&player);
//generate target
spawn(&target);
//generate enemies
spawn(&enemy1);
spawn(&enemy2);
spawn(&enemy3);

void spawn(COORD *point)
{
    //allot X and Y coordinate to a point
    point->X = randNum();
    point->Y = randNum();
}

int randNum()
{
    //generate a random number between 1 and gridSize
    return (rand() % gridSize) + 1;
}

ฉันต้องการเพิ่มสิ่งต่าง ๆ ลงในเกม แต่ความน่าจะเป็นของการทับซ้อนเพิ่มขึ้นเมื่อฉันทำเช่นนั้น มีวิธีแก้ไขปัญหานี้หรือไม่?


8
rand () เป็น RNG ที่ไม่ดี
ratchet freak

3
rand()เป็น pityfull RNG และอย่างไรก็ตามด้วยช่วงขนาดเล็กเช่นนี้คุณไม่เพียงแค่คาดหวังว่าจะมีการชน แต่รับประกันได้เลย
Deduplicator

1
ในขณะที่มันเป็นความจริงที่rand()เป็น RNG หมัดมันอาจจะเหมาะสำหรับเกมผู้เล่นคนเดียวและคุณภาพ RNG ไม่ได้เป็นปัญหาที่นี่
Gort the Robot

13
การพูดเกี่ยวกับคุณภาพของrand()ดูเหมือนจะไม่เกี่ยวข้องที่นี่ ไม่มีการเข้ารหัสที่เกี่ยวข้องและ RNG ใด ๆ อาจจะให้การชนกันในแผนที่ขนาดเล็กเช่นนี้
Tom Cornebize

2
สิ่งที่คุณเห็นเป็นที่รู้จักกันว่าปัญหาวันเกิด หากตัวเลขสุ่มของคุณถูกแปลงเป็นช่วงที่เล็กกว่าช่วงธรรมชาติของ PRNG ความน่าจะเป็นที่จะได้รับสองอินสแตนซ์ของหมายเลขเดียวกันนั้นสูงกว่าที่คุณคิด บางเวลาที่ผ่านมาฉันเขียนแจ้งความในเรื่องนี้ใน Stackoverflow ที่นี่
ConcOfOfTunbridgeWells

คำตอบ:


40

ในขณะที่ผู้ใช้ที่บ่นrand()และแนะนำ RNG ที่ดีกว่านั้นถูกต้องเกี่ยวกับคุณภาพของตัวเลขสุ่มพวกเขายังขาดภาพที่ใหญ่ขึ้น ซ้ำกันในลำธารของตัวเลขสุ่มไม่สามารถหลีกเลี่ยงพวกเขาเป็นความจริงของชีวิต นี่คือบทเรียนของปัญหาวันเกิด

บนตะแกรงที่มีตำแหน่งวางไข่ที่เป็นไปได้ 20 * 20 = 400 จุดคาดหวังที่วางไข่ซ้ำกัน (ความน่าจะเป็น 50%) แม้ว่าจะวางไข่เพียง 24 หน่วย ด้วย 50 เอนทิตี (ยังคงเพียง 12.5% ​​ของกริดทั้งหมด) ความน่าจะเป็นของการทำซ้ำมีมากกว่า 95% คุณต้องจัดการกับการชน

บางครั้งคุณสามารถวาดตัวอย่างทั้งหมดในครั้งเดียวจากนั้นคุณสามารถใช้อัลกอริทึมแบบสุ่มเพื่อวาดnรายการที่มีการรับประกันแตกต่างกัน คุณเพียงแค่ต้องสร้างรายการของความเป็นไปได้ทั้งหมด หากรายการความเป็นไปได้เต็มรูปแบบมีขนาดใหญ่เกินไปที่จะจัดเก็บคุณสามารถสร้างตำแหน่งการวางไข่ทีละครั้งเช่นเดียวกับตอนนี้ (เพียงมี RNG ที่ดีกว่า) และเพียงสร้างใหม่เมื่อเกิดการชน แม้ว่าจะมีการชนกันบางอย่างแต่การชนกันจำนวนมากในแถวนั้นไม่น่าจะอธิบายถึงแม้ว่ากริดส่วนใหญ่นั้นจะบรรจุอยู่


ฉันคิดเกี่ยวกับการตอบสนองในกรณีที่เกิดการชน แต่ถ้าฉันมีรายการมากกว่าที่ฉันตั้งใจไว้การค้นหาการชนจะซับซ้อน ฉันจะต้องแก้ไขการตรวจสอบในกรณีที่มีการเพิ่มหรือลบจุดออกจากเกม ฉันไม่มีประสบการณ์พอใช้ได้ถ้ามีวิธีแก้ปัญหานี้ฉันก็ไม่เห็น
Rabeez Riaz

7
หากคุณมีกระดานหมากรุกขนาด 20x20 ตรงข้ามกับระนาบ XY แบบต่อเนื่อง (จริง) 20x20 สิ่งที่คุณมีคือตารางการค้นหา 400 เซลล์เพื่อตรวจสอบการชน นี่คือสิ่งสำคัญ
John R. Strohm

@RabeezRiaz หากคุณมีแผนที่ที่ใหญ่กว่าคุณจะมีโครงสร้างข้อมูลแบบกริด (กริดที่ประกอบด้วยพื้นที่บางส่วนของเซลล์และทุกรายการภายในเซลล์นั้นถูกเก็บไว้ในรายการ) หากแผนที่ของคุณใหญ่ขึ้นคุณจะใช้แผนผังทรี

2
@RabeezRiaz: หากการค้นหาซับซ้อนเกินไปให้ใช้คำแนะนำแรกของเขา: สร้างรายการสถานที่เริ่มต้นที่เป็นไปได้ทั้งหมด 400 รายการสับเปลี่ยนเพื่อให้อยู่ในลำดับสุ่ม (ค้นหาอัลกอริทึม) จากนั้นเริ่มใช้ตำแหน่งจากด้านหน้าเมื่อคุณต้องการ เพื่อสร้างเนื้อหา (ติดตามจำนวนที่คุณใช้ไปแล้ว) ไม่มีการชน
RemcoGerlich

2
@RabeezRiaz ไม่จำเป็นต้องสลับรายการทั้งหมดถ้าคุณต้องการเพียงค่าสุ่มจำนวนน้อยเพียงแค่สับส่วนที่คุณต้องการ (เช่นใช้ค่าสุ่มจากรายการ 1..400 ลบออกแล้วทำซ้ำจนกระทั่ง คุณมีองค์ประกอบเพียงพอ) ในความเป็นจริงนั่นเป็นวิธีการทำงานของอัลกอริทึมแบบสับ
Dorus

3

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

  1. ตั้งค่าการรวบรวมการอ้างอิงไปยังตำแหน่งที่เป็นไปได้ทั้งหมดบนแผนที่ (สำหรับแผนที่ 20x20 ซึ่งจะเป็น 400 ตำแหน่ง)
  2. เลือกสถานที่โดยการสุ่มจากคอลเล็กชัน 400 (rand () นี้จะใช้งานได้ดีสำหรับเรื่องนี้)
  3. ลบความเป็นไปได้นี้ออกจากคอลเล็กชันตำแหน่งที่เป็นไปได้ (ดังนั้นจึงมีความเป็นไปได้ 399 ข้อ)
  4. ทำซ้ำจนกระทั่งเอนทิตีทั้งหมดมีตำแหน่งที่ระบุ

ตราบใดที่คุณลบตำแหน่งออกจากชุดที่คุณเลือกไม่ควรมีโอกาสที่เอนทิตีที่สองที่รับตำแหน่งเดียวกัน (เว้นแต่คุณเลือกสถานที่มากกว่าหนึ่งเธรดในคราวเดียว)

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


1

เกี่ยวข้องกับการrand() % nเป็นน้อยกว่าอุดมคติ

การทำrand() % nมีการกระจายที่ไม่สม่ำเสมอ คุณจะได้รับจำนวนค่าที่ไม่สมส่วนเนื่องจากจำนวนของค่าไม่ได้เป็นหลายเท่าของ 20

ถัดไปrand()โดยทั่วไปเป็นเครื่องกำเนิดไฟฟ้าเชิงเส้นเชิงเส้น (มีคนอื่น ๆ อีกมากมายเพียงแค่นี้เป็นหนึ่งในการดำเนินการมากที่สุด - และมีพารามิเตอร์ที่เหมาะน้อยกว่า (มีหลายวิธีในการเลือกพารามิเตอร์)) ปัญหาที่ใหญ่ที่สุดของเรื่องนี้คือบ่อยครั้งที่บิตต่ำในมัน (สิ่งที่คุณได้รับจาก% 20นิพจน์ประเภท) ไม่ใช่การสุ่ม ฉันจำได้หนึ่งrand()ปีที่ผ่านมาที่บิตต่ำสุดสลับจาก1ไปยัง0กับการโทรแต่ละครั้งrand()- มันไม่ได้สุ่มมาก

จากหน้าแรนด์ (3) หน้า:

เวอร์ชันของ rand () และ srand () ใน Linux C Library ใช้เหมือนกัน
ตัวสร้างตัวเลขสุ่มเป็น random () และ srandom () ดังนั้นลำดับที่ต่ำกว่า
บิตควรเป็นแบบสุ่มเช่นเดียวกับบิตลำดับสูงกว่า อย่างไรก็ตามเมื่ออายุมากขึ้น
การใช้งานแรนด์ () และการใช้งานในปัจจุบันที่แตกต่างกัน
ระบบบิตที่มีลำดับต่ำกว่านั้นจะสุ่มน้อยกว่าค่าที่สูงกว่า -
บิตสั่งซื้อ อย่าใช้ฟังก์ชั่นนี้ในแอพพลิเคชั่นที่ต้องการ
แบบพกพาเมื่อจำเป็นต้องมีการสุ่มที่ดี

ตอนนี้อาจถูกลดชั้นลงไปในประวัติศาสตร์ แต่เป็นไปได้ว่าคุณยังมีแรนด์ที่แย่ () การใช้งานซ่อนตัวอยู่ที่ไหนสักแห่งในกองซ้อน ในกรณีนี้มันยังใช้งานได้ค่อนข้าง

สิ่งที่ต้องทำคือการใช้ห้องสมุดเลขสุ่มที่ดี (ที่ให้ตัวเลขสุ่มที่ดี) แล้วขอตัวเลขสุ่มภายในช่วงที่คุณต้องการ

ตัวอย่างของรหัสสุ่มบิตที่ดี (จาก 13:00 ในวิดีโอที่เชื่อมโยง)

#include <iostream>
#include <random>
int main() {
    std::mt19937 mt(1729); // yes, this is a fixed seed
    std::uniform_int_distribution<int> dist(0, 99);
    for (int i = 0; i < 10000; i++) {
        std::cout << dist(mt) << " ";
    }
    std::cout << std::endl;
}

เปรียบเทียบสิ่งนี้กับ:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    srand(time(NULL));
    for (int i = 0; i < 10000; i++) {
        printf("%d ", rand() % 100);
    }
    printf("\n");
}

เรียกใช้โปรแกรมเหล่านี้ทั้งสองและเปรียบเทียบความถี่ที่จำนวนที่แน่นอนเกิดขึ้น (หรือไม่เกิดขึ้น) ในผลลัพธ์นั้น

วิดีโอที่เกี่ยวข้อง: rand () ถือว่าเป็นอันตราย

บางแง่มุมทางประวัติศาสตร์ของแรนด์ () ก่อให้เกิดข้อบกพร่องใน Nethack ที่เราควรดูและพิจารณาในการใช้งานของตัวเอง:

  • แก้ไขปัญหา RNG

    Rand () เป็นฟังก์ชันพื้นฐานสำหรับการสร้างหมายเลขสุ่มของ Nethack วิธีที่ Nethack ใช้คือบั๊กกี้หรืออาจเป็นที่ถกเถียงกันอยู่ว่า lrand48 () สร้างตัวเลขสุ่มหลอกเส็งเคร็ง (อย่างไรก็ตาม lrand48 () เป็นฟังก์ชั่นห้องสมุดโดยใช้วิธี PRNG ที่กำหนดไว้และโปรแกรมใด ๆ ที่ใช้มันควรคำนึงถึงจุดอ่อนของวิธีการนั้น)

    ข้อผิดพลาดคือ Nethack อาศัย (บางครั้งก็เป็นเช่นเดียวกับใน rn (2)) ที่บิตด้านล่างของผลลัพธ์จาก lrand48 () ด้วยเหตุนี้ RNG ในเกมทั้งหมดจึงใช้งานไม่ได้ สิ่งนี้เป็นสิ่งที่สังเกตได้โดยเฉพาะก่อนที่การกระทำของผู้ใช้จะนำมาซึ่งการสุ่มเพิ่มเติมเช่นในการสร้างตัวละครและการสร้างระดับแรก

ในขณะที่ข้างต้นมาจากปี 2003 มันควรจะยังคงเก็บไว้ในใจเพราะมันอาจจะไม่ใช่กรณีที่ระบบทั้งหมดที่ใช้งานเกมที่คุณต้องการจะเป็นระบบ Linux ที่ทันสมัยพร้อมฟังก์ชั่น rand () ที่ดี

หากคุณเพียงแค่ทำสิ่งนี้ด้วยตัวคุณเองคุณสามารถทดสอบว่าตัวสร้างตัวเลขสุ่มของคุณดีแค่ไหนโดยการเขียนโค้ดและทดสอบผลลัพธ์ด้วยเอนท์


เกี่ยวกับคุณสมบัติของตัวเลขสุ่ม

มีการตีความอื่น ๆ ของ 'สุ่ม' ที่ไม่ได้สุ่มอย่างแน่นอน ในสตรีมข้อมูลแบบสุ่มเป็นไปได้ค่อนข้างมากที่จะได้รับหมายเลขเดียวกันสองครั้ง หากคุณพลิกเหรียญ (สุ่ม) เป็นไปได้มากทีเดียวที่จะได้รับสองหัวติดต่อกัน หรือโยนลูกเต๋าสองครั้งแล้วรับหมายเลขเดียวกันสองครั้งติดต่อกัน หรือหมุนวงล้อรูเล็ตและรับหมายเลขเดียวกันสองครั้ง

การแจกแจงของตัวเลข

เมื่อเล่นรายการเพลงผู้คนคาดหวังว่า 'สุ่ม' หมายความว่าเพลงหรือศิลปินเดียวกันจะไม่เล่นเป็นครั้งที่สองติดต่อกัน การมีเพลย์ลิสต์เล่น The Beatles สองครั้งติดกันถือว่าไม่ 'สุ่ม' (แม้ว่าจะเป็นการสุ่ม) การรับรู้ว่าสำหรับรายการเพลงสี่เพลงเล่นทั้งหมดแปดครั้ง:

1 3 2 4 1 2 4 3

มี 'สุ่ม' มากกว่า:

1 3 3 2 1 4 4 2

เพิ่มเติมเกี่ยวกับสิ่งนี้สำหรับ 'การสับ' ของเพลง: วิธีการสลับเพลงได้อย่างไร

เกี่ยวกับค่าซ้ำ

หากคุณไม่ต้องการที่จะทำซ้ำค่ามีวิธีการที่แตกต่างกันที่ควรพิจารณา สร้างค่าที่เป็นไปได้ทั้งหมดและสลับค่า

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

รายการและเลือก

ตัวเลือกอื่นคือการสร้างรายการของสถานะที่ถูกต้องทั้งหมดที่เป็นไปได้แล้วเลือกองค์ประกอบแบบสุ่มจากรายการนั้น ค้นหาจุดที่ว่างเปล่าทั้งหมด (ที่ตรงตามกฎบางอย่าง) ในห้องจากนั้นเลือกจุดสุ่มจากรายการนั้น จากนั้นทำอีกครั้งและอีกครั้งจนกว่าจะเสร็จ

สับเปลี่ยน

อีกวิธีคือการสับไพ่ราวกับว่าเป็นไพ่ เริ่มต้นด้วยสปอตที่ว่างเปล่าทั้งหมดในห้องจากนั้นเริ่มกำหนดสปอตโดยการจัดการสปอตที่ว่างเปล่าทีละครั้งสำหรับแต่ละกฎ / กระบวนการเพื่อขอสปอตที่ว่างเปล่า คุณทำเสร็จเมื่อการ์ดหมดหรือสิ่งที่หยุดขอ


3
Next, rand() is typically a linear congruential generatorสิ่งนี้ไม่เป็นความจริงในหลาย ๆ แพลตฟอร์มในขณะนี้ จาก rand (3) man page ของ linux: "เวอร์ชั่นของ rand () และ srand () ใน Linux C Library ใช้ตัวสร้างหมายเลขสุ่มแบบเดียวกับ random (3) และ srandom (3) ดังนั้นบิตที่ต่ำกว่า ควรสุ่มเป็นบิตลำดับสูงกว่า " นอกจากนี้เมื่อ @delnan ชี้ให้เห็นคุณภาพของ PRNG ไม่ใช่ปัญหาจริงที่นี่
Charles E. Grant

4
ฉันกำลัง downvoting นี้เพราะมันไม่ได้แก้ปัญหาที่เกิดขึ้นจริง
user253751

@immibis จากนั้นคำตอบอื่น ๆ ก็ไม่ได้ "แก้ปัญหา" ที่เกิดขึ้นจริงและควรจะ downvoted ฉันคิดว่าคำถามไม่ได้ "แก้ไขรหัสของฉัน" แต่ก็เป็น "ทำไมฉันถึงได้รับหมายเลขที่ซ้ำกัน" สำหรับคำถามที่สองฉันเชื่อว่าคำถามนั้นตอบแล้ว
Neil

4
แม้ว่าค่าที่น้อยที่สุดคือRAND_MAX32767 ความแตกต่างคือ 1638 วิธีที่เป็นไปได้ในการรับตัวเลขเทียบกับ 1639 สำหรับผู้อื่น ดูเหมือนว่าไม่น่าจะสร้างความแตกต่างในทางปฏิบัติกับ OP ได้
Martin Smith

@ ไม่มี "แก้ไขรหัสของฉัน" ไม่ใช่คำถาม
การแข่งขัน Lightness ใน Orbit

0

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

วิธีนี้มีประโยชน์ในการหลีกเลี่ยงการซ้อนกันของเซลล์ที่เลือกแบบสุ่ม

ข้อเสียคือคุณต้องคำนวณค่าสุ่มในรายการแยกสำหรับแต่ละเซลล์ของคุณ ดังนั้นคุณไม่ควรทำขณะที่เกมเริ่มต้นขึ้น

นี่คือตัวอย่างของวิธีที่คุณสามารถทำได้:

#include <algorithm>
#include <iostream>
#include <vector>

#define NUMBER_OF_SPAWNS 20
#define WIDTH 20
#define HEIGHT 20

typedef struct _COORD
{
  int x;
  int y;
  _COORD() : x(0), y(0) {}
  _COORD(int xp, int yp) : x(xp), y(yp) {}
} COORD;

typedef struct _spawnCOORD
{
  float rndValue;
  COORD*coord;
  _spawnCOORD() : rndValue(0.) {}
} spawnCOORD;

struct byRndValue {
  bool operator()(spawnCOORD const &a, spawnCOORD const &b) {
    return a.rndValue < b.rndValue;
  }
};

int main(int argc, char** argv)
{
  COORD map[WIDTH][HEIGHT];
  std::vector<spawnCOORD>       rndSpawns(WIDTH * HEIGHT);

  for (int x = 0; x < WIDTH; ++x)
    for (int y = 0; y < HEIGHT; ++y)
      {
        map[x][y].x = x;
        map[x][y].y = y;
        rndSpawns[x + y * WIDTH].coord = &(map[x][y]);
        rndSpawns[x + y * WIDTH].rndValue = rand();
      }

  std::sort(rndSpawns.begin(), rndSpawns.end(), byRndValue());

  for (int i = 0; i < NUMBER_OF_SPAWNS; ++i)
    std::cout << "Case selected for spawn : " << rndSpawns[i].coord->x << "x"
              << rndSpawns[i].coord->y << " (rnd=" << rndSpawns[i].rndValue << ")\n";
  return 0;
}

ผลลัพธ์:

root@debian6:/home/eh/testa# ./exe 
Case selected for spawn : 11x15 (rnd=6.93951e+06)
Case selected for spawn : 14x1 (rnd=7.68493e+06)
Case selected for spawn : 8x12 (rnd=8.93699e+06)
Case selected for spawn : 18x13 (rnd=1.16148e+07)
Case selected for spawn : 1x0 (rnd=3.50052e+07)
Case selected for spawn : 2x17 (rnd=4.29992e+07)
Case selected for spawn : 9x14 (rnd=7.60658e+07)
Case selected for spawn : 3x11 (rnd=8.43539e+07)
Case selected for spawn : 12x7 (rnd=8.77554e+07)
Case selected for spawn : 19x0 (rnd=1.05576e+08)
Case selected for spawn : 19x14 (rnd=1.10613e+08)
Case selected for spawn : 8x2 (rnd=1.11538e+08)
Case selected for spawn : 7x2 (rnd=1.12806e+08)
Case selected for spawn : 19x15 (rnd=1.14724e+08)
Case selected for spawn : 8x9 (rnd=1.16088e+08)
Case selected for spawn : 2x19 (rnd=1.35497e+08)
Case selected for spawn : 2x16 (rnd=1.37807e+08)
Case selected for spawn : 2x8 (rnd=1.49798e+08)
Case selected for spawn : 7x16 (rnd=1.50123e+08)
Case selected for spawn : 8x11 (rnd=1.55325e+08)

เพียงเปลี่ยน NUMBER_OF_SPAWNS เพื่อรับเซลล์สุ่มมากขึ้นหรือน้อยลงสิ่งนี้จะไม่เปลี่ยนเวลาการคำนวณที่จำเป็นสำหรับงาน


"จากนั้นเพื่อเรียงลำดับทั้งหมดของพวกเขา" - ฉันเชื่อว่าคุณหมายถึง "สลับ"

ฉันได้อธิบายเล็กน้อยแล้ว มันควรจะชัดเจนขึ้นในขณะนี้
KwentRell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.