[Day 24] Random 연습문제

NA YE SOM·2023년 8월 1일
0

1. 주사위 던지기

// 주사위 3개를 동시에 던져서 나오는 상황을 연출하시오. Random 클래스를 활용하시오.
// 실행예시)
// 주사위: [3, 1, 5]


-> seed를 전달하지 않겠다(2번째 것) : 현재 시간(TimeStamp) 값을 seed로 쓰겠다

Random 객체가 정수 6개를 만듦(nextInt(6))
정수 6개 중 한개가 나옴
0~5까지가 6개임
-> 0때문에 주사위로 볼 수 없음

-> 주사위로 0이 나오면 안됨

StringBuilder 씀
-> 반복문에 의해서 , 찍음
마지막은 닫는것만

2.통장(balance)에 최초 5000원이 있다.

// 1원부터 통장 잔고 사이의 난수를 발생시켜서 해당 난수만큼 출금 처리하시오.
// 더 이상 출금이 불가능한 상황이면 출금을 멈추시오.
// 실행예시)
// 출금 전 5000원, 1회 출금액 2917원, 출금 후 2083원
// 출금 전 2083원, 2회 출금액 1961원, 출금 후 122원
// 출금 전 122원, 3회 출금액 102원, 출금 후 20원
// 출금 전 20원, 4회 출금액 2원, 출금 후 18원
// 출금 전 18원, 5회 출금액 17원, 출금 후 1원
// 출금 전 1원, 6회 출금액 1원, 출금 후 0원


-> 빨간색 변수있음, 파란색 변수없음

-> 다 random (몇번에 끝날지 모름)
-> 한번에 끝날수도 있음
-> while문 쓰면 됨

balance가 있으면 계속하는것
출금액 만들때 규칙있음 -> 통장잔고 이상을 랜덤으로 만들면 안됨
-> 통장잔고가 계속해서 변한다

balance기준임

0~9 사이의 랜덤 발생 : 10개 랜덤


-> math.random 이 0에서 1사이임
곱하기 10 하면 -> 0.0 ~10.0
int로 casting해서 0은 포함 10은 불포함
(0이상 10미만)

-> 10보다 1작은 숫자만들어야 함

(int)(Math.random() * 100)
통장에 100원있으면
0 ~ 99원 만들어짐
-> 프로그램 끝나지 않음
(100원을 만들수있어야 끝남)


-> 통장에 들어있는 돈이 100원이라고 가정시)
1원~100원 만들수있도록 +1 추가해야함(통장잔액보다 크지않은 랜덤값 생성가능)


최초 5000만듦

부족하니까 + 1

(어쩌면 5000원이 나올 수 있게)
1원 ~ balance까지



-> 출금전 5000원하면 또 더해야 함 (불편함)


-> 미리 빼면 불편해짐 , 빼는 걸 나중에 함

-> 복합연산의 반환값은 왼쪽으로

출금액을 빼고 balance를 찍어줌


-> 몇번걸리든 무조건 끝나야 함

3.인증코드 6자리 만들기.

// 0~9 사이 값을 이용하여 임의의 인증코드 6자리를 생성하시오. SecureRandom 클래스를 활용하시오.
// 실행예시)
// 인증코드: [966419]

인증코드 만들때는 secureRandom 쓰기
-> 사용법이 random과 거의 같음


-> 10개 중 한개(시작은 0이고, 0~9까지)


-> 반복문으로 바꾸기


-> 0에서 시작했고 6번 돌렸다라는 뜻

4.구구단을 외자.

// 2~9단 사이의 임의의 구구단이 출력되면 사용자는 정답을 입력한다.
// 정답을 입력해서 맞히면 "정답", 틀리면 "땡"을 출력하시오. Math 클래스의 random() 메소드를 활용하시오.
// 실행예시1)
//   4x9? >>> 36
//   정답
// 실행예시2)
//   8x7? >>> 49
//   땡

이메일로 보내는 것은 구현함
인증코드를 문자로 보내는 서비스도 있음
api 돌릴때마다 30원씩 차감되는 것도 있음


-> +2는 괄호 안이나 밖으로 나가도 되고 상관없음

2부터 dan : 8개

★Math.random() 실무에서 많이씀

Math.random() 0.0 ~ 1.0 범위에 속하는 하나의 double 타입의 값을 리턴함
0.0은 범위 포함되고 1.0은 포함되지 않음

Math.random()을 활용한 다양한 난수 얻기
(1) 각 변에 10을 곱하기
0.0 <= .. < 10.0 사이의 범위에 속하는 하나의 double타입의 값을 얻을 수 있음
0.0 10 <= Math.random() < 1.0 10
(2) 각변을 int타입으로 강제 변환시켜서 0<=..<10 사이의 범위에 속하는 하나의 int타입의 값을 구하기
(int)(0.0 10) <= (int)(Math.random() 10) < (int)(1.0 10)
(3) 각 변에 1을 더하면 1<= .. < 11범위에 속하는 하나의 정수 얻음
(int)(0.0
10) + 1 <= (int)(Math.random() 10) < (int)(1.0 10) + 1

random은 객체만듦-> 벌써 메모리 써서 -> 성능상 문제



-> 삼항연산자

5. 자동으로 진행되는 윷 던지기를 구현하시오. 윷이나 모가 나오면 추가로 던지시오.

// 실행예시1)
//   "도", 1칸 이동한다.
// 실행예시2)
//   "개", 2칸 이동한다.
// 실행예시3)
//   "걸", 3칸 이동한다.
// 실행예시4)
//   "윷", "도", 5칸 이동한다.
// 실행예시5)
//   "모", "윷", "도", 10칸 이동한다.

-> 인덱스 번호 = 이동횟수

-> 12345를 만든다고 생각해야함
(4나 5가 만들어지면 또 랜덤을 하면됨)
(반복문이 필요함 : 랜덤으로 만든값이 4이상이면 또 한번 랜덤 돌리기 -> 그값을 또 보여주면 됨)

0은 만들 필요없음


1. do-while문이 좋고(while보다는) : 한번은 던져야 그 다음에 할지 안할지 결정을 할 것임
2.무한루프(break로 끊어버리기)

(실행문) 랜덤값이 4이상이면

랜덤번호 = 이동횟수(move) 12345


이동횟수 1 : 도 출력

큰따움표 출력하는 방법(문자열로 넣기)


-> 앞에 두개 빈문자열 뒤에는 쓰레기로 생각함

"\" 역슬래쉬 해야 함

println -> print로(줄안바뀜)

,(콤마) 찍고 또 던질건지?결정해야함

move가 do 안에 있어서 오류남-> scope

윷 move 4 도 move 1
합쳐서 5가 나옴 -> 변수가 부족함


-> 0으로 초기화

끝나고 출력하는건 몇칸이동한다고 출력한다

자동주석 ctrl + /(슬래쉬)

6. 가위바위보.

// 사용자로부터 "가위", "바위", "보" 중 하나를 입력 받아서 컴퓨터와 가위바위보를 진행하시오.
// 내부적으로 가위는 0, 바위는 1, 보는 2로 처리하시오.
// 실행예시)
// 가위바위보 >>> 가위
// 당신은 가위, 컴퓨터는 보, 당신은 이겼습니다.
**

★ 가위바위보에 쓴 아이디어 생각! **

컴퓨터가 0,1,2 만들지 몰라야 함(난수)


-> 012 중에 하나 만듦( 뒤에 +0 할필요없음)


-> 사용자가 입력한 가위바위보를 가지고 switch를 돌리겠다

-> 나머지 경우는 고려 x

->가위바위보는 몇개 안되니까 그냥 switch로 풀 수 있음

0,1,2 중에 하나가진것(가위바위보로 입력했지만 012로 바뀐것)

9가지 조합 -> if로 짜는건 좋지 x


-> 결과를 string으로 저장시키기


-> com , user도 rsp 인덱스 모두 가지고 있음
-> 파란색 부분까지는 이미 출력가능
-> 이겼다, 졌다 , 비겼다만


-> string result로 저장했다가 마지막에 출력할 예정

(ex) 가위 (0) -> 보(2)
바위(1) -> 가위(0)
보(2) -> 바위(1)

-> 3개 조건
user - com = -2, 1, 1
-> 뺀 결과가 -2가 나오거나 1이 나오면 이겼다고 볼 수 있음
-> 두개를 한개로 묶었다는것에 만족할 수 있음

if

switch로 바꾸기

user 가 나올 수 있는건 rsp임
rsp 0 -> 가위
rsp 1 -> 바위
rsp 2 -> 보

컴퓨터는 가위,바위,보 중 하나를 만든걸로 생각!

+++ 질때까지 계속하기(몇승몇무몇패까지 할수있음)

java.script 로 짜면 화면으로 할 수 있음(웹을 조정하는 언어)- 2주
j.query 수업

7. "대문자+소문자+숫자"로 구성된 인증번호를 만드시오.

// 사용자로부터 몇 자리의 인증번호를 만들것인지 입력 받아서 처리하시오.
// 대문자와 소문자와 숫자는 임의의 비율로 나타나도록 처리하시오. SecureRandom 클래스를 활용하시오. 
// 실행예시1)
//   몇 자리의 인증번호를 생성할까요? >>> 4
//   생성된 4자리 인증번호는 7W5e입니다.
// 실행예시2)
//   몇 자리의 인증번호를 생성할까요? >>> 6
//   생성된 6자리 인증번호는 Fa013b입니다.


-> string많이 던지면 안좋음(3번에서)

stringbuffer나 stringbuilder 써야함(빠른건 stringbuilder)


-> count만큼 반복하는 것

★ 고민하지말고

-> 6번 숫자만큼 반복하는거다

방금 6이 count로 바뀜

-> count만큼 반복하겠구나

변수이름만 보고 의미가 전달되는것이 좋음
i를 쓰면 배열쓰자는 의미가 될 수 있음

셋중에 알아서 해야함


-> 확률처리하기(33%확률로 숫자만들기, 대문자만들기 ..)


-> 1이 백분율에서는 100%로 되어서
확률로 보면 타당함
(0%~ 100% 사이의 값이다)


-> 0.1 x 100 => 10% 확률

33%로 하기


-> 0은 0%이고 1은 100%임

-> 33%가 안넘을 확률

숫자) 10개중 한개


-> int값 0~9 나오는것
아까는

이런식

sb에 누적하기

-> 또다른 33%

아스키코드


65부터 90까지 만든다(random으로 만들 수 있는건 어차피 숫자라서)

-> 65부터 28개


-> 97부터 알파벳 소문자 시작

nextInt가 반환하는건 int값

26~65사이에 숫자가 나옴 int 더하기 int

casting : int를 char로 바꾸는 방법

-> 더하기 하고 casting해야함


-> 둘의 관계는 같다


-> int로 표기하면 65, A로 표기하면 A

char는 작은따움표로 묶어야 함 'A'-> A라는 문자가 됨
-> 연산해서 사용될때는 자동으로 형변환되서 65로 사용됨


-> stringBuilder쓰면 무조건 마지막은 toString : string으로 바꿔야함

-> 나중에 library(라이브러리)가 있어서 알아서 만들어 줌

8. 0~9 사이 난수를 100개 생성하시오.

// 발생한 0~9 사이의 각 난수들이 생성된 횟수(빈도수)를 그래프화 하여 출력하시오.
// 실행예시)
// 0 : #### 4
// 1 : ############ 12
// 2 : ############ 12
// 3 : ##### 5
// 4 : ######## 8
// 5 : ########### 11
// 6 : ############ 12
// 7 : ################## 18
// 8 : ####### 7
// 9 : ########### 11


만개중에 1개

우리가 입력할 숫자 : input


몇번만에 성공할건지 : nth(회차)

do- while 입력을 해야 끝나기 때문에
못 맞췄으면 계속해라 -> goal을 input으로 찾을예정인데
둘이 다르면



-> 맞추든 못맞추든 회차증가는 해야함

9. 0~9 사이 난수를 100개 생성하시오.

  • 배열 2개
    // 발생한 0~9 사이의 각 난수들이 생성된 횟수(빈도수)를 그래프화 하여 출력하시오.
    // 실행예시)
    // 0 : #### 4
    // 1 : ############ 12
    // 2 : ############ 12
    // 3 : ##### 5
    // 4 : ######## 8
    // 5 : ########### 11
    // 6 : ############ 12
    // 7 : ################## 18
    // 8 : ####### 7
    // 9 : ########### 11


-> 0~9를 만드는 것

생성해서 집어넣는건 0~9 사이
(ex) 2가 만들어지면,
count배열 인덱스 2를 하나 늘림
-> 2가 또 만들어지면,

number[i] number배열에 저장된 값
count[i] count배열의 인덱스 자리에다가 넘기


-> ++ 해서 1씩만 증가시키면 되니까

(보통은) 100개 저장하고 100개 또 돌림

number배열에 생성된 값을 count의 index로 활용하기

count[number[i]] ++

-> 연습장 꺼내놓고 많이 연습해보기!


-> 출력할건 count배열의 상태


-> 하나하나 이어붙여야 하니까 : StringBuilder써야함

count배열에 저장된 만큼 반복

count배열에 5 있으면 ##### 샵 5번 찍음


-> count i만큼 ########### 한것

10.다음 순서에 따라서 5 x 5 형태의 숫자 빙고판을 자동으로 생성하시오.

// 지시사항)
// 1. 1 ~ 25 사이 정수를 2차원 배열 bingo에 순차적으로 넣는다.
// 1 2 3 4 5
// 6 7 8 9 10
// 11 12 13 14 15
// 16 17 18 19 20
// 21 22 23 24 25
// 2. 섞는다.
// 총 25번의 교환이 랜덤하게 발생된다.
// bingo[0][0] <-> bingo[1][4]
// bingo[0][1] <-> bingo[0][2]
// bingo[0][2] <-> bingo[2][1]
// ...
// bingo[4][4] <-> bingo[3][1]
// 실행예시)
// 10 9 4 25 2
// 15 3 13 21 1
// 14 20 11 19 6
// 8 17 5 12 7
// 16 22 18 24 23

(j+1)은 항상 12345임

-> 빙고판의 크기를 SIZE만 바꾸면 바꿀 수 있음
(본문 전체에서 계속 사용됨)

bingo.length의 자리인데 그렇게 할 필요 x(같은거라서)



-> i다음에 곱해주는값 - 5 : SIZE임 (SIZE에 따라서 달라짐)

배열 3개짜리부터 해보기 33, 44 ,55 하면 보임



-> 값을 맞춰서 (안쪽에 j배열이 끝나면)
출력


-> 순서대로 채워주고 섞는건 아직 안함


-> 필드폭을 3자리까지는 괜찮음

앞에 빙고 i j를 순차적으로 접근 (random임)

-> 자기가 자기를 바뀔 수도 있고(25개 돌고나면 예상하지 못할만큼 섞였음)


-> 0~ size -1 (이전까지 random값을 2개 만들어야함)

x, y값을 random으로 만들어야함


-> xy가 랜덤값



-> 교환하는 방법 : temp(임시변수)만들고(direct로 교환은 불가능) - 한쪽이 주면 덮어써서 같아짐
(한바퀴 돌리기)


-> 임시변수(t)를 시작과 끝에 적고 a 2번, b 2번쓰면 교환가능

랜덤해서 생성해서 집어넣기로 하면 중복처리 못함
(만들었던 숫자 또 나올 수 있음)

-> 성능 떨어짐

먼저 다 쓰고 섞는게 최선임

profile
개발자 velog

2개의 댓글

comment-user-thumbnail
2023년 8월 4일

어려워요............

1개의 답글