2012-04-04 2 views
1

이전에 무작위로 서명되지 않은 char 생성과 관련된 질문을 한 적이 있습니다. 그러나 적용된 단순성으로 인해 꽤 좋은 제안이 왔습니다. srand((unsigned)time(NULL)); rand()%256; 서명되지 않은 문자의 난수는 계속 '?'입니다.

나는 프로그램의 시작 부분에서 srand를 한 번 호출하지만, 나는 계속 '?' 임의의 char에 대해. 모든 시간이 아니지만 대부분의 시간과 그로 인해 나는 내 초점을 잃게된다.

+3

숫자 값을 확인하고 실제로 '?'(ASCII 값 63)인지 확인하고 있습니까? 아니면 캐릭터를 인쇄하고 있습니까? 그렇다면 비 ASCII 값 (예 : 범위 128-255)이'?'로 인쇄 될 수 있습니다. 이것을 인쇄하기 전에'int'로 변환 해보십시오. –

+0

관찰 한 내용을 설명해주십시오. 임의의 문자. 더 나은 방법은 ** 짧은 **, ** 완료 ** 테스트 프로그램을 제공하십시오. http://sscce.org/를 참조하십시오. –

답변

9

대부분의 경우 터미널에서 인쇄 방법이 필요없는 임의의 문자가 계속 입력되어 ?을 출력합니다. 인쇄하기 전에 int로 변환 해보십시오 :

std::cout << (int)my_random_char; 
+0

고마워, 내 문제를 해결. 나는 현재 Mac에서 캐릭터가 우분투 터미널에 표시 될 것인가? – Ali

+2

@rolandbishop : 어떤 사람들은 그렇지 않을 수도 있습니다. 이것은 터미널의 설정, 문자셋에 달려 있습니다 ... 임의의 * 숫자를 생성하는 경우 * 문자가 아닌 * 숫자 *를 출력해야합니다. 이것이 바로 'int'로의 변환이 작동하는 것입니다. 원하는 문자가 실제 문자라면 인쇄 가능한 하위 세트 만 사용하는 것이 좋습니다. –

3

을 자신에 유효한 문자하지 않을 수 있습니다 플랫폼에 값 [128 255]을 따라. 임의의 인쇄 가능한 ASCII 문자를 원한다면 [32 127] 범위의 문자를 생성해야합니다.

다른 질문에 대한 대답에서 인쇄 가능한 ASCII 문자 만 선택하도록 코드가 수정되었습니다.

int main() { 
    std::random_device r; 
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()}; 
    auto rand = std::bind(std::uniform_int_distribution<char>(' ','~'), 
          std::mt19937(seed)); 

    std::generate_n(std::ostream_iterator<char>(std::cout," "), 25, rand); 
} 
+0

@rolandbishop : C++은 문자 값의 범위를 인쇄 할 수 있다고 보장하지 않지만 32-127은 거의 모든 것을 처리하는 경향이 있습니다. –

+0

예, 구현이 ASCII 호환되지 않을 수도 있습니다.이국적인 시스템을 제외하고는 요즘 모든 것이 있습니다. – bames53

5

' 문자로 인쇄 할 수 없기 때문에 선택한 문자를 인쇄 할 수 있습니다. 그것을 정수로 출력하면 값이 임의대로 예상됩니다.

1

몇 가지 고려해야 할

  1. rand()의 각 호출하기 전에 srand()를 호출하지 않습니다. 프로그램을 시작할 때 한 번 호출하십시오 (실제로 원한다면).
  2. 부호없는 문자를 정수로 출력하여 결과를 확인해보십시오.
+0

은 이미 내가 한 번 부른다고 말했습니다 ... – Ali

+0

오, 예 ... 다른 사람들이 지적한 것처럼 정수로 가십시오. 대부분 '?'로 표현되는 아스키 범위를 벗어나는 값을 얻는 것처럼 보입니다. 터미널에. – Axel

+0

추신 : 편집 한 내용에 추가하셨습니까? 나는 전에 그것을 보지 못했다고 맹세 할 수 있었다. – Axel

1

부호없는 문자는 문자가 아닙니다. 그들은 바이트입니다. 0에서 255 사이의 임의의 바이트를 가져오고 일부는 (또는 인코딩에 따라 대부분) 유효한 문자가 아닙니다. 당신이 및 z 사이의 임의 문자를 원하는 경우

, 예를 들어,

unsigned char c = 'a' + rand() % 26; 

같은 (rand() % 26이 일의 권장 방법이 아니다 사용하지만, 대부분의 응용 프로그램에 충분합니다. 맨 페이지를 참조하십시오 .)