블랙 잭 게임을 만들기 위해 CPP를 사용하고 있지만 순서를 반복하지 않고 무작위로 [4] [13] 배열에서 요소를 선택하는 방법에 대해 고심하고 있습니다. 배열의. VisualStudio에서 작업하기. 지금까지 1-D 배열로이 작업을 수행하는 방법에 대한 해답을 찾을 수 있습니다. 아무도 제안이 없나요?반복하지 않고 2 차원 배열에서 무작위로 선택
답변
글쎄, 한 가지 방법은 배열 요소에 bool
필드를 추가하는 것이고, 배열 요소가 선택되면 true로 설정하는 것입니다. 그런 다음 장래 선택 사항에서 bool
이 true
인지 확인하고, 그렇다면 다른 임의의 요소를 생성하십시오. 가장 효율적인 것은 아니지만 간단합니다.
이렇게하면 배열을 반복하고 모든 bool 필드를 false로 설정하여 임의 재생을 시뮬레이트하는 메서드를 쉽게 만들 수 있습니다.
나는 "가장 효율적이지 않다"는 말은 삼가면서 말하는 것입니다. 값이 많이 사용될수록 사용되지 않는 다른 값을 찾으려는 시도가 많아집니다. –
일정한 횟수 (예 : 10 개 정도)가 지나면 모든 bool을 false로 설정하는 셔플 방법이 있어야합니다. 이렇게하면이 문제가 어느 정도 완화됩니다. – user2366842
이것은 실제로 자바 스크립트에서 블랙 잭 게임을 만드는 데 사용 된 방법입니다. – smac89
2D 배열은 1D 배열로 쉽게 간주 될 수 있습니다. 당신은 단지 약간의 수학을 할 필요가 있습니다.
52 개 요소 1D 배열 (임의로 정렬 된 값이 0-51 인 새 배열)에 사용할 수있는 솔루션이있는 경우. 다음을 수행하십시오
- 이 임의 요소를 생성, R (0 ~ 51)를 호출 할 수 있습니다.
- 이제 해당 숫자를 2D 배열 시스템으로 변환하십시오. (X 형태, Y)
x = R/13
y = R % 13
그리고 1d 배열에 대한 해결책은 다음과 같습니다. 1-52의 숫자를 가진 무작위 배열을 만든 다음 반복합니다. 반복 없음, 성능 저하 없음. –
피셔 예테 (Fisher-Yates)를 답변에 추가하여 완성시키지 않는 이유는 무엇입니까? "https://en.wikipedia.org/wiki/Knuth_shuffle" –
@ IngoBürk 빙고! –
한 방법 I 차원 배열을 교체 한 다음 2 개 좌표를 생성 하였다 언제나처럼. n
횟수만큼 수행 한 다음 일부 for loops
을 사용하여 2D 배열을 반복 할 수 있습니다.
나는 모든 카드가 들어있는 목록을 사용하고 싶습니다. 당신이 [4] suites [13] 숫자를 가진 2 차원 배열을 고집한다면, 답은 간단하다. 그러나 배열 변수를 Boolean으로 만들어라.
ill 의사 코드를 작성하십시오.
initialize cardsselected to zero
Choose Card
Randomly select 2 numbers 1 will be 0-3 and the other 0-12.
If the array at [random suite][random number] is not false
choose it
increment cardsselected
set value to false
return true
else if cardsselected equals 52 return false
else
run chooseCard()
return true
이건 그냥 솔루션입니다. 그것은 이 아니고 매우 최적화되어 있습니다. 영원히 걸릴 수 있습니다.
최적화하려면.
2d 어레이는 난수를 생성하는 카드를 보관할 수 있습니다. 난수 생성을 최적화하기 위해 난수 1-52의 목록을 만들어 무작위로 선택하면됩니다. 그런 다음 목록에서 선택한 번호를 제거하십시오.
사실 각 셀에 연속 번호를 할당하여이를 수행하려고 생각했지만 교수는 빌드를 원합니다. 초기 값 ""을 가지는 char로서의 「데크」 이것은 우리가 나중에 어떤 카드가 어떤 플레이어에게 갔는지 출력리스트를 생성 할 수 있도록하기 위해서입니다. 주어진 셀을 그 카드가 처리 된 플레이어의 수로 업데이트하면됩니다. 내가 말했듯이, 그것이 가장 효율적인 방법이 아닐 수도 있습니다. 나는 지시를 따르려고하고있다. -/ – user2755333
@ user2755333 이것은 여전히 효과가있을 것이다. 문자 배열이 맞습니까? 2 개의 어레이 또는 2 개의 데크가 있습니다. 하나는 "깨끗한 데크"이고 "사용 가능한 데크"입니다. 클린 데크의 값은 항상 완벽하게 유지됩니다. 사용 가능한 데크와 동일하지만, 선택할 때마다 값을 기본 char (null)로 설정하게됩니다. 거짓 대신에. 그런 다음 내 코드와 동일한 논리를 따르고 작동해야합니다. 그런 다음 다시 섞기를 원할 때마다 깨끗한 덱의 값을 사용 가능한 덱으로 던지십시오. – progrenhard
std::deque<T>
컨테이너를 사용할 것을 적극 권장합니다. 갑판 자체를 나타 내기위한 이중 종료 대기열을 사용하면 상대방을 처리 할 때 '카드'를 누를 수 있습니다.
사용 std::random_shuffle
무작위 0-51
에서 vector (말 vector<int> v
) 셔플한다. random_shuffle
이 주어진 벡터를 뒤섞기 때문에, v
은 임의로 뒤섞인 벡터입니다.
v.back()
은 벡터의 마지막 요소를 반환합니다. 따라서 다음 코드는 벡터에서 마지막 요소 (k
)를 반환 한 다음 제거합니다. 또한 double
으로 변환하여 k/13
을 계산할 수 있습니다. 하여 행렬 4x13이기 때문에
double k = static_cast<double>(v.back());
v.pop_back();
이제 k
번째 요소는 (주 행)은 행 및 열 floor(k/13)
k%13
이다.
사이드 노트 : 숫자 52를 하드 코드하지 마세요. 같은 어레이에 여러 개의 덱을 셔플 할 가능성이 있습니다. 블랙 잭 게임에서 카지노는 종종 블랙 잭 "신발"에서 여러 개의 데크를 사용합니다. 특히 신발 당 4 개의 데크가 상당히 일반적입니다. 이것은 조건부 확률에 중요한 의미를 갖는다 : 앞면 위로 향한 카드와 뒤집힌 얼굴 사이의 상관 관계가 적다. 52 장 카드 덱을 따로 섞어서는 안되며, N * 52 카드 끈 전체를 섞어 야합니다. 다른 대답에서 제안 된 알고리즘은 사소한 수정만으로 2-D 어레이뿐만 아니라 3-D 어레이에서도 작동합니다.
소수를 사용하는 간단한 해결책이 있습니다. 배열에서 무작위 초기 색인을 취하면 (단순성을 위해 1D 배열로 함) 배열 길이보다 큰 소수로이 색인을 증가시키고 배열 길이로 나눈 후 알림 만 취하면 무작위 반복되지 않는 색인의 순서. 이 같은
뭔가 : N 후
#include <cstdlib>
#include <iostream>
#include <time.h>
const int Cols = 4;
const int Rows = 13;
const int N = Cols * Rows;
const int NPrimes = 12;
const int primes[NPrimes] = {59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107};
int prime = primes[0];
int index = 0;
void shuffle()
{
srand(time(NULL)); // Random seed
prime = primes[rand() % NPrimes]; // Get random prime number
index = rand() % N; // Get random first index
}
// Compute next index in sequence
int nextIndex(int index)
{
return (index + prime) % N;
}
int _tmain(int argc, _TCHAR* argv[])
{
shuffle();
for (int i = 0; i < N; i++) {
int col = index/Rows;
int row = index % Rows;
std::cout << "[" << col << ", " << row << "] ";
index = nextIndex(index);
}
std::cout << std::endl;
return 0;
}
는 순서가 분명히 자신을 반복합니다 반복.
- 1. C++ 반복하지 않고 무작위로 항목 수 선택
- 2. 2 차원 배열에서 임의의 문자열을 선택 하시겠습니까?
- 3. 반복하지 않고 문자열을 무작위로 배열
- 4. 무작위로 반복하지 않고 정수를 생성합니다.
- 5. jQuery 배열에서 무작위로 선택
- 6. 2 차원 배열에서 객체 선택 js
- 7. 2 차원 배열에서 "가장 낮은"항목 선택
- 8. 파이썬 2 차원 배열에서
- 9. 정렬하지 않고 2 차원 배열에서 중복을 찾아서 바꾸기 - 정렬하지 않고
- 10. 반복하지 않고 무작위로 동영상을 재생할 수있는 방법
- 11. 반복없이 문자열 배열에서 무작위로 선택
- 12. 무작위로 요소의 배열 배열에서 선택
- 13. 표시 2 임의 배수를 PHP에서 반복하지 않고 배열에서 배열
- 14. 반복하지 않고 임의의 게시물 선택
- 15. 2 차원 배열에서 1 차원 배열로?
- 16. 무작위로 2 차원 행렬에서 행 선택 및 제거하기
- 17. 2 차원 배열에서 모서리 제거
- 18. 2 차원 배열에서 열 제거
- 19. 2 차원 배열에서 그룹화가 발생할 확률
- 20. 배열에서 무작위로 고유 한 요소 선택
- 21. 2 차원 배열의 배열에서 2 차원 배열의 수 얻기
- 22. numpy의 1d 배열을 사용하여 2 차원 배열에서 여러 요소 선택
- 23. C에서 값을 반복하지 않고 배열에서 값을 선택하는 방법
- 24. 2 차원 배열에서 ko.utils.arrayGetDistinctValues를 적용하는 방법
- 25. 자바가 무작위로 2 차원 배열을 지정합니다
- 26. 무작위로 2 차원 행렬에 조건을 채우십시오.
- 27. arrayList 단어로 2 차원 배열을 무작위로 채우십시오.
- 28. 무작위로 2 차원 배열을 중복없이 인쇄하려면 어떻게해야합니까?
- 29. 무작위로 2D 배열에서 특정 int 선택
- 30. Jquery가 임의로 이전 번호를 반복하지 않고 2 개의 숫자를 숨기기
2D 배열이 필요한 이유가 있습니까? – shuttle87
다음은 배열을 랜덤 화하는 방법에 대한 좋은 토론입니다. http://stackoverflow.com/questions/6127503/shuffle-array-in-c –
답변 수락하기! – jlars62