본문 바로가기

프로그래밍/알고리즘

[C,C++,Java,JS,Py,Ruby] 로또 번호 생성 초간단 알고리즘


C++11

#include <vector>

#include <algorithm>

#include <ctime>

#include <stdio.h>

using namespace std;

 

int main() {

    srand((unsigned int) time(NULL));

    vector<int> num;

    for (int i = 1; i <= 45; i++)

        num.push_back(i);      //1~45 초기화


    random_shuffle(num.begin(), num.end());      //모두 섞음

    sort(num.begin(), num.begin() + 6);   // 6 숫자만 정렬

    for (int n : vector<int>(num.begin(), num.begin() + 6))

        printf("%02d ", n);   //표시

    return 0;

}

 



C++14

#include <vector>

#include <algorithm>

#include <random>

#include <chrono>

#include <stdio.h>

using namespace std;

 

int main() {

    unsigned seed = chrono::system_clock::now().time_since_epoch().count();

    mt19937_64 rnd(seed);

    vector<int> num;

    for (int i = 1; i <= 45; i++)

       num.push_back(i);      //1~45 초기화


    shuffle(num.begin(), num.end(), rnd);      //모두 섞음

    sort(num.begin(), num.begin() + 6);   // 6 숫자만 정렬

    for (int n : vector<int>(num.begin(), num.begin() + 6))

       printf("%02d ", n);   //표시

    return 0;

}

 



메인함수 빈 줄 이전은 초기화이고

여러번 생성하고 싶을 경우 빈 줄 이후로 리턴 전까지만 for루프를 돌리면 됩니다.


백터를 1~45로 초기화 한 다음 백터를 랜덤 셔플하고 첫 6개 숫자만 정렬해서 출력하는 코드입니다.



C

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

void swap(int* a, int* b) {

    int temp = *a;

    *a = *b;

    *b = temp;

}

int comp(const void *a, const void *b) {

    int v = *(int*) a - *(int*) b;

    return v ? v > 0 ? 1 : -1 : 0;

}

void random_shuffle(int arr[], int size) {

    int i;

    for (i = size - 1; i > 0; i--)

       swap(&arr[i], &arr[rand() % (i + 1)]);

}

 

int main(void) {

    int num[45], i;

    srand(time(NULL));

    for (i = 0; i < 45; i++)

       num[i] = i + 1; //1~45 초기화

 

    random_shuffle(numbers, 45);     //모두 섞음

    qsort(num, 6, sizeof(int), comp); // 6 숫자만 정렬

    for (i = 0; i < 6; i++)

       printf("%02d ", num[i]);     //표시

    return 0;

 

} 


순수 C는 swap이랑 random_shuffle이랑 comp함수를 직접 구현해줘서 그렇지

사실상 C++ 코드와 같은 방식으로 작동합니다.



Java

import java.util.*;

 

public class LottoGen {

   public static void main(String[] args) {

       List<Integernum = new Vector<Integer>(45);

       for (int i = 1i <= 45i++)

          num.add(i); // 1~45 초기화


       Collections.shuffle(num);  //모두 섞음

       List<Integerselected = num.subList(06); //  6 숫자만 정렬

       Collections.sort(selected);

       for (int n : selected)

          System.out.format("%02d "n); // 표시

   }

} 



Javascript

function swap(arr, a, b) {

   var temp = arr[a];

   arr[a] = arr[b];

   arr[b] = temp;

}

 

function random_shuffle(arr) {

   for (var i = arr.length - 1; i > 0; i--)

       swap(arr, i, Math.floor(Math.random() * (i + 1)));

}

 

(function() {

   var num = [];

   for (var i = 1; i <= 45; i++)

       num.push(i);  // 1~45 초기화


   random_shuffle(num); //모두 섞음

   var selected = num.slice(0, 6);   // 6 숫자만 정렬

   selected.sort(function(a,b){return a-b;});

   alert(selected); // 표시

})();

 



Python

import random

selected random.sample(range(146)6#1~45중 숫자 6개 뽑음

selected.sort() #정렬
print(selected) #표시



함수형like 프로그래밍


Ruby

puts (1..45).to_a.sample(5).sort.join(',')


Javascript (lodash.js)

alert(_(1).range(46).sampleSize(5).sortBy());


Python (pydash)

from pydash import _
print(_(range(1,46)).sample(5).sort().value())


표현법이 좀 다르긴 하지만 모두 같은 알고리즘