본문 바로가기

파이썬(PYTHON)

파이썬을 이용한 위치에 따른 점들의 랜덤한 움직임에 대한 고찰 (경계면 구속 조건시)

728x90

1. 정의 및 조건 : 입자의 확산을 모사함 

   CASE #1 : 중앙에서 시작,

   CASE #2 : 임의의 위치에서 시작

2차원 정사각형의 중앙에 최초에 위치한 점 100개 (위치 중첩 허용)이 램덤하게 움직일 경우, 정사각형의 각 선분과 맞날 경우 그 선분에 고정될 경우의 확률과 최초에 2차원 정사각형 면의 위치한 점 100개가 랜덤하게 이동할 경우

 

2. 문제 :

2개의 경우에 대한 분포 확률을 통해 상호간 확률을 비교하여 위치에 따른 

 

3. 실행 이미지 (예시) :

 

4. Test 결과 (상단, 하단, 좌측, 우측) (95% 이상시)

 

4.1 At CASE #1-1 (200 x 200)

 . Test #1 : 22, 23, 19, 31

 . Test #2 : 21, 26, 24, 24

 . Test #3 : 28, 22, 18, 27

 . Test #4 : 23, 22, 24, 24

 . Test #5 : 22, 30, 27, 16

 . Test #6 : 23, 23, 22, 27

 . Test #7 : 27, 22, 23, 23

 . Test #8 : 29, 21, 31, 14

 . Test #9 : 21, 30, 27, 17

 . Test #10 : 25, 21, 24, 25

 

4.2 At CASE #1-1 (600 x 600)

 . Test #1 : 26, 24, 16, 29

 . Test #2 : 23, 25, 17, 30

 . Test #3 : 27, 26, 26, 16

 . Test #4 : 17, 28, 20, 30

 . Test #5 : 22, 24, 30, 19

 . Test #6 : 33, 20, 23, 19

 . Test #7 : 19, 27, 24, 25

 . Test #8 : 24, 24, 20, 27

 . Test #9 : 21, 30, 31, 13

 . Test #10 : 21, 27, 24, 23

 

4.3 At CASE #2-1 (200 x 200)

 . Test #1 : 23, 22, 29, 21

 . Test #2 :15, 26, 29, 25

 . Test #3 : 25, 19, 27, 25

 . Test #4 : 26, 22, 21, 26

 . Test #5 : 25, 23, 26, 21

 . Test #6 : 24, 27, 24, 20

 . Test #7 : 30, 19, 28, 18

 . Test #8 : 21, 29, 23, 22

 . Test #9 : 21, 28, 20, 26

 . Test #10 : 23, 26, 24, 22

 

4.4 At CASE #2-2 (600 x 600)

 . Test #1 : 19, 24, 25, 27

 . Test #2 : 24, 26, 22, 23

 . Test #3 : 20, 25, 25, 25

 . Test #4 : 30, 19, 26, 20

 . Test #5 : 22, 26, 26, 21

 . Test #6 : 29, 24, 14, 28

 . Test #7 : 27, 18, 23, 27

 . Test #8 : 23, 28, 26, 18

 . Test #9 : 17, 24, 27, 27

 . Test #10 : 27, 21, 24, 23

 

5. 실행 코드 :

import pygame
import time, random
import numpy as np


SCREEN_WIDTH = 600
SCREEN_HEIGHT = 600
FRAME = 500
RAD = 3
DONE = False
EA = 100

pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))


while True:
    done = False

    clock = pygame.time.Clock()

    px = []
    py = []

    for i in range(EA):
        #px.append(random.randint(0, SCREEN_WIDTH-1))
        #py.append(random.randint(0, SCREEN_HEIGHT-1))
        px.append(SCREEN_WIDTH/2)
        py.append(SCREEN_HEIGHT/2)

    def point_move(x, y):
        a = random.randint(-1, 1)
        if 0 < x < SCREEN_WIDTH:
            if a > 0:
                x += 1
            if a < 0:
                x -= 1

        b = random.randint(-1, 1)
        if 0 < y < SCREEN_HEIGHT:
            if b > 0:
                y += 1
            if b < 0:
                y -= 1
       
        return x, y

    while not DONE:
        clock.tick(FRAME)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done=True
        screen.fill('#000000')
        cou_up = 0
        cou_down = 0
        cou_left = 0
        cou_right = 0

        for i1 in range(EA):
            px[i1], py[i1] = point_move(px[i1], py[i1])

            if px[i1] <= 0:
                cou_left += 1
           
            if px[i1] >= SCREEN_WIDTH-1:
                cou_right += 1
           
            if py[i1] <= 0:
                cou_up += 1
           
            if py[i1] >= SCREEN_HEIGHT-1:
                cou_down += 1
           
        #print(cou_up, cou_down, cou_left, cou_right)

        for i2 in range(EA):
            pygame.draw.circle(screen, '#0000FF', [px[i2], py[i2]], RAD, 0)
       
        if cou_up + cou_down + cou_left + cou_right >= 95:
            print(cou_up, cou_down, cou_left, cou_right)
            break

        pygame.display.update()

결론 및 결과 :

추정 :

 1) 입자의 크기와 최초 위치 대비 경계선까지의 거리 비율이 클수록 그 분포 비율의 차이는 커짐

 

728x90