2021년 5월 26일 수요일

의사 난수 생성기 - Pseudo Random Number Generator (PRNG)

 

의사 난수 생성기 (Pseudo Random Number Generator : PRNG)는 많은 양의 난수가 필요할때 확률 및 통계 응용프로그램을 위해 작성되고 사용되는 프로그램입니다. 이러한 프로그램의 대부분은 일반적으로 10진수로 된 끝없는 한자리 숫자 문자열을 생성합니다. 의사 난수의 큰 샘플을 채취하면 {0,1,2,3,4,5,6,7,8,9} 집합의 10자리 숫자는 순서대로 균등하게 분배되지 않을지라도 동일한 빈도로 발생합니다.

 

많은 알고리즘은 주어진 지점까지의 숫자를 기반으로 다음 숫자를 이론적으로 예측하는 것이 불가능한 숫자의 끝없는 문자열인 진정으로 무작위 숫자 시퀀스를 생성하려는 시도로 개발되었습니다. 그러나 알고리즘의 존재 자체는 아무리 정교하더라도 다음 숫자를 예측할 수 있음을 의미합니다. 이로 인해 이러한 기계로 생성되는 숫자 문자열에 대해서 의사 랜덤이라는 용어가 생겼습니다. 대부분의 응용프로그램에서 난수 시퀀스는 엄격한 정의에 따르면 실제로는 무작위가 아닙니다.

 

π (유클리드 평면에서 원의 원주와 지름의 비율), e (자연 대수) 또는 완전 제곱이 아닌 숫자의 제곱근 (2 1/2 또는 10 1/2와 같은)과 같은 숫자들를 일부 수학자들은 진정한 무작위라고 믿습니다. 컴퓨터는 이러한 숫자를 소수 자릿수 수천, 수백만, 수십억 또는 수조로 확장하도록 프로그래밍할 수 있습니다. 가장 오른쪽에 있는 숫자로 시작하거나 2번째, 3번째, 4번째 또는 n번째 숫자를 사용하는 시퀀스를 선택할 수 있습니다. 그러나 일부 이론가들은 그러한 숫자들을 결정하는 알고리즘은 진정한 무작위가 아니라 의사 무작위라고 주장합니다.

 

진정한 난수에 대해서 논란의 여지가 있지만 의사 난수 생성기 (PRNG)는 수학적 공식을 사용하여 난수 시퀀스를 생성하는 알고리즘을 사용하는데 초기 시드 (Seed) 상태를 사용하여 임의의 시작 상태에서 시작하여 난수의 속성에 가까운 일련의 숫자를 생성하도록 합니다.

 

2021년 5월 21일 금요일

[파이썬] 전역 변수들의 상태 등을 보여주는 globals() 함수

 

특정 모듈내에서 사용되는 전역 변수들의 변수 이름 및 현재 값 등을 알고 싶을 때 사용하는 함수가 바로 globals()라는 파이썬 빌트인 함수가 있습니다.

 

def test():

    a = 1

    b = 2

    print ("Local Variables in test function")

    print(locals())

 

test()

 

c = 3

b = 4

 

print ("Global Variables in this module")

print (globals())

 

위의 코드에서 locals 함수는 test 함수내의 로컬 변수의 이름과 현재 값을 출력하며, globals 함수는 이 코드내의 전역 변수의 이름과 현재 값을 출력하여 보여줍니다.

 

Local Variables in test function

{'a': 1, 'b': 2}

 

Global Variables in this module

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0368AF40>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'globals_test1.py', '__cached__': None, 'test': <function test at 0x037EAFA0>, 'c': 3, 'b': 4}

 

이전에 올린 locals 함수와 마찬가지로 globals 함수도 dict 데이터형으로 전역 변수들의 이름과 현재 값을 출력합니다. 실제 사용하는 변수외에 다른 부분들이 같이 나오는데, 이것들은 시스템에서 사용하는 전역변수들입니다.

 

그래서 아래 코드와 같이 전역 변수의 값을 변경하거나 추가하는 코드를 실행해보도록 하겠습니다.

 

c = 3

b = 4

 

print ("Global Variables in this module")

print (globals())

 

globals()['c'] = 13

 

print ("Global Variables in this module after changing values")

print (globals())

 

globals()['d'] = 14

 

print ("Global Variables in this module after adding variable and value")

print (globals())

 

그리고 이 코드의 실행결과는 아래와 같습니다.

 

Global Variables in this module

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0336AF40>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'globals_test2.py', '__cached__': None, 'c': 3, 'b': 4}

 

Global Variables in this module after changing values

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0336AF40>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'globals_test2.py', '__cached__': None, 'c': 13, 'b': 4}

 

Global Variables in this module after adding variable and value

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0336AF40>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'globals_test2.py', '__cached__': None, 'c': 13, 'b': 4, 'd': 14}

 

두번째 실행결과를 보면 locals 함수와는 다르게 globals 함수를 사용하여 전역변수의 값이 3에서 13으로 변경가능함을 볼 수 있습니다.

 

그리고 마찬가지로 globals 함수를 사용하여 새로운 전역변수 추가도 가능함을 볼 수 있습니다.

 

2021년 5월 20일 목요일

[파이썬] 로컬 변수들의 상태 등을 보여주는 locals() 함수

 

특정 함수내에서 사용되는 로컬 변수들의 변수 이름 및 현재 값 등을 알고 싶을 때 사용하는 함수가 바로 locals()라는 파이썬 빌트인 함수가 있습니다.

 

아래 소스를 보시면 바로 이해가 빠를 것입니다.

 

def test():

    a = 1

    b = 1

    print (locals())

 

test()

 

여기서 test라는 함수에서 ab라는 로컬 변수가 있는데, locals() 함수를 사용하면 이들 변수들의 현재 값을 알수 있습니다.

 

아래가 실행한 결과입니다.

 

{'a': 1, 'b': 1}

 

locals() 함수는 로컬 변수 이름과 현재 값들을 dict 데이터형으로 돌려줍니다.

 

아래의 코드와 같이 dict형 데이터 변수의 값을 변경할 수 있지 않을까 해서 한번 시도를 해보았습니다.

 

def test():

    a = 1

    b = 1

    print (locals())

 

    locals()['a'] = 3

    locals()['b'] = 4

    print (locals())

 

test()

 

그러나 아래와 같이 locals()로는 로컬 변수의 값을 변경할 수 없습니다.

 

{'a': 1, 'b': 1}   # 첫번째 locals()에서 출력한 값

{'a': 1, 'b': 1}   # 두번째 locals()에서 출력한 값

 

그러면 아래 코드는 어떨까요? dict형에서 새로운 로컬 변수 항목을 추가하여 실행시키는 코드입니다.

 

def test():

    a = 1

    b = 1

    print (locals())

 

    locals()['c'] = a + b

    print (locals())

 

test()

 

아래와 같이 새로 추가된 변수의 값은 locals() 함수를 사용하여 변경가능합니다.

 

{'a': 1, 'b': 1}   # 첫번째 locals()에서 출력한 값

{'a': 1, 'b': 1, 'c': 2}   # 두번째 locals()에서 출력한 값

 

또 하나의 코드를 보면, 로컬 변수를 locals() 함수로 추가하여 값을 계산한 다음, 다시 다른 값으로 변경하는 코드입니다.

 

def test():

    a = 1

    b = 1

    print (locals())

 

    locals()['c'] = a + b

    print (locals())

 

    locals()['c'] = 10

    print (locals())

 

test()

 

위의 코드의 ‘c’라는 새로 추가한 로컬 변수는 언제든제 값이 변경가능하고 기존에 있던 ‘a’‘b’ 변수의 값을 변경할 수가 없습니다.

 

{'a': 1, 'b': 1}   # 첫번째 locals()에서 출력한 값

{'a': 1, 'b': 1, 'c': 2}   # 두번째 locals()에서 출력한 값

{'a': 1, 'b': 1, 'c': 10}   # 세번째 locals()에서 출력한 값

 

2021년 5월 18일 화요일

[파이썬] pass 키워드 사용법

 

pass라는 파이썬 키워드는 실제로 아무것도 실행되지 않고 넘어가는 키워드입니다.

 

구문이 필요하지만 코드를 실행할 필요가 없을때 빈 자리를 채우기 위해 사용됩니다.

 

아래에 그 사용예가 나와 있습니다.

 

def func ():

pass

 

이와 같이 함수를 정의를 했지만 사실상 비어 있는 함수 정의를 위해 사용되고 있습니다.

 

class Func:

pass

 

위의 경우와 같이 “Func”라는 비어 있는 클래스를 정의할때도 사용됩니다.

 

단순히 함수 이름과 클래스 이름만 있으면, 혹시 잘못된 것이라고 오해를 하는 것을 막기 위해서가 아닌가 생각됩니다. 그리고 향후 실제 사용될 함수나 클래스를 위해 사전 준비하는 것이라고도 생각됩니다.

 

2021년 5월 17일 월요일

5G Fixed Wireless Access (FWA)

고정 무선 액세스 (Fixed Wireless Access : FWA)는 두 고정 지점간의 무선 연결을 제공하는 방법입니다. , 고정 무선은 연결을 제공하기 위해 광섬유 및 케이블을 배치하지 않고 가정이나 기업에 무선 인터넷 액세스를 제공하는 방법입니다. 네트워크 사업자는 광섬유를 설치하거나 광섬유 라인을 유지하는데 드는 비용이 엄청나게 비싼 교외 및 농촌 지역에 FWA를 통해 초고속 광대역을 제공할 수 있습니다. 특히 FWA 방법에 5G 통신을 사용하면 유용할 수 있습니다.

 

고정 무선 기술 (LTE, WiMAX )은 꽤 오랫동안 사용되어 왔습니다. 그러나 고정 광대역을 제공하는데 드는 비용과 복잡성은 고속 데이터 서비스의 출시에 지속적으로 어려움을 겪고 있습니다. WiMAX와 같은 기술은 완전히 새로운 인프라와 값비싼 전용 장비를 요구했기 때문에 대부분 실패했습니다. 4G/LTE 기술을 기반으로 한 FWA도 시도되었지만 이 기술은 스펙트럼적으로 비효율적이고 설치 비용이 많이 들고 유선 광대역 연결과 경쟁하는데 필요한 속도를 제공할 수 없습니다.

 

이런 이유로 5G 통신이 유용한 기술로 부각되고 있습니다. 5G FWA는 표준화된 3GPP 아키텍처와 일반 모바일 구성 요소를 사용하여 주거용 가입자와 기업 고객에게 초고속 광대역 서비스를 제공합니다. 밀리미터 파장의 New Radio를 특징으로 하는 5G FWA는 모든 시장에서 유선 DSL, 케이블 및 광섬유에 대한 경쟁력있는 대안을 제공할 수 있습니다. 이를 통해 교외 및 농촌 소비자는 고화질 스트리밍 서비스 및 고속 인터넷 액세스를 지원하는데 필요한 대역폭을 받을 수 있습니다.

 

차세대 5G 기반 고정 무선 기술은 기존 광섬유 기술 범위내에서 몇 Gbps 정도의 데이터 속도에 도달할 것으로 예상됩니다. 5G와 이전 기술간의 데이터 속도 향상의 큰 부분은 스펙트럼 용량 증가에서 비롯됩니다. 5G 고정 무선 네트워크는 더 넓은 스펙트럼을 쉽게 사용할 수 있는 mm-Wave 대역 (28GHz, 37GHz, 39GHz )을 활용할 것으로 예상됩니다. 스펙트럼 증가외에도 5G 네트워크는 이전 4G 제품과 비교할때 스펙트럼 효율성을 몇 배나 높이도록 설계되고 있습니다. Massive MIMO, 빔 포밍 및 빔 추적과 같은 고급 안테나 기술이 핵심 요소가 될것 입니다.

 

고정 무선 액세스가 직면한 주요 과제

 

mm-Wave 대역의 무선 전송은 본질적으로 손실이 있습니다. 또한 환경 변화 (단풍, , 비 등)에 매우 민감합니다. 서비스 제공 업체는 가구당 인프라 비용을 증가시킬 수 있는 더 작은 셀 크기를 계획해야 합니다. 빔 포밍 및 대규모 MIMO 기술은 이러한 문제중 일부를 완화하기 위한 것입니다. 그러나 이러한 기술은 복잡하고 비용이 많이 듭니다.

 

전파 손실이 높을수록 허용 가능한 링크를 유지하기 위해 더 높은 수준의 무선 전력을 방출하기 위해 고객의 가정용 게이트웨이가 필요합니다. RF 노출로부터 적절한 안전을 유지하기 위해 새로운 기술이 개발되어야 합니다.

 

지역 규제 기관은 지역 제한을 완화하여 운영자가 쉽게 무선 장치를 설치할 수 있도록 해야 합니다. 승인 기간이 길수록 비즈니스를 더욱 악화시킬 수 있습니다.

 

정부, 서비스 제공 업체, 장비 제조업체, 반도체 공급 업체는 모두 전세계적으로 조화된 스펙트럼 내에서 단일 5G 표준을 중심으로 통합해야 합니다. 표준화는 비용 절감에 도움이 되는 여러 공급 업체의 강력한 에코 시스템을 가능하게 합니다.

 

Frequency

FWA

Coverage

Throughput

700MHz

N

Excellent

Poor

3.4~3.8GHz

Y

Good

Good

24.25~27.5GHz

Y

Poor

Excellent


  

[파이썬] 파이썬에서 함수 정의 방법 - 1

 

함수 정의는 사용자 정의 함수 객체를 정의합니다.

 

함수 정의는 실행 가능한 명령문입니다.

 

함수 정의는 함수 본문을 실행하지 않습니다. 이것은 함수가 호출될 때만 실행됩니다.

 

def sum (a, b):

    return a + b

 

a = 5

b = 6

c = sum (a, b)

 

print ("a : ", a)

print ("b : ", b)

print ("sum of a and b : ", c)

 

위의 코드는 함수 정의의 간단한 예입니다. 실행결과는 아래와 같습니다.

 

a :  5

b :  6

sum of a and b :  11

 

어떤 함수는 인자를 가지지 않을 수도 있습니다.

 

어떤 함수는 특정 인자에 대해서 디폴트 값을 지정할 수 있으며, 이 인자를 함수 호출시 명시하지 않으면, 디폴트 값으로 대체됩니다.

 

def comp (score=0):

    if score == 0:

        return 0

    elif score > 50:

        return 2

    else:

        return 1

 

grade = comp (40)

print ("Grade is ", grade, " for ", 40)

 

grade = comp (80)

print ("Grade is ", grade, " for ", 80)

 

grade = comp ()

print ("Grade is ", grade, "for no score")

 

위의 코드에서 보듯이 score를 명시하지 않고 그냥 함수를 호출하면 디폴트 값인 0으로 대체되어 함수 객체에서 계산되어 처리됩니다.

 

아래가 그에 대한 실행결과입니다.

 

Grade is  1  for  40

Grade is  2  for  80

Grade is  0 for no score

 

3번째 함수 호출시 아무런 인자를 넘기기 않았는데, score에 디폴트 값인 0으로 대체되어 처리된 실행결과입니다.

 

2021년 5월 16일 일요일

뇌-컴퓨터 인터페이스 - Brain Computer Interface (BCI)

 BCI (Brain-Computer Interface)는 뇌의 신호가 커서 또는 의족의 제어와 같은 일부 외부 활동을 제어할 수 있도록 장치와 뇌 사이의 인터페이스입니다. 이 인터페이스는 제어할 물체와 뇌 사이의 직접적인 통신이 가능하게 합니다. 예를 들어, 커서 제어의 경우, 뇌에서 신체의 신경근 시스템을 통해 마우스를 손가락으로 정상적으로 제어하는 경로를 취하는 대신 뇌에서 커서를 지시하는 메커니즘으로 직접 전송됩니다.


BCI는 뉴런들로부터 신호를 읽고 컴퓨터 칩과 프로그램을 사용하여 신호를 동작으로 변환함으로써, 마비로 고통받는 사람이 생각만으로 책을 쓰거나 전동 휠체어 또는 의족을 제어할 수 있게 해줍니다. 현재의 뇌-인터페이스 장치는 제어하고자 하는 의도적인 노력이 필요합니다. 인공 기관 제어와 같은 일부 미래의 응용프로그램은 보다 쉽게 제어할 수 있을 것입니다. BCI 기술 개발의 가장 큰 과제중 하나는 최소 침습성 전극 장치 및/또는 수술 방법의 개발이었습니다. 전통적인 BCI 모델에서 뇌는 이식된 기계 장치를 받아들이고 신체가 자연스럽게 제어되도록 장치를 제어합니다. 현재의 많은 연구는 비침습성 BCI의 잠재력에 초점을 맞추고 있습니다.


2006년 6월 파리에서 열린 유럽 연구 혁신 전시회에서 미국 과학자 피터 브루너는 디스플레이에 집중하는 것만으로 메시지를 작성하는 시연을 했습니다. Brunner는 여러 전극이 장착된 캡을 밀착되게 착용했습니다. Brunner의 뇌에서 발생한 뇌파 (EEG) 활동은 캡의 전극과 소프트웨어와 함께 사용된 정보를 통해 메시지의 특정 문자 또는 문자를 식별하는데 사용되었습니다.


Brunner의 시연은 Wadsworth 시스템이라는 방법을 기반으로 합니다. 다른 EEG 기반 BCI 기술과 마찬가지로 Wadsworth 시스템은 통신을 용이하게 하기 위해 적응형 알고리즘 및 패턴 일치 기술을 사용합니다. 사용자와 소프트웨어 모두는 연습을 통해 적응하고 학습하여 프로세스를 더 효율적으로 만듭니다.