C++. rand()를 함수 내에서 활용하려고 할때 같은 값이 반복되네요.

frhyme의 이미지

너무 쉬운 질문인것 같아 죄송스럽습니다만..

간단하게,
메인함수내에서

for(;;)
{
srand(time(NULL));
a=rand();
}

위 코드가 있을 경우에는 a의 값이 계속 다른 값이 출력되는데,

따로 함수를 정의해서, 함수명이 function_1이라고 하면

void function_1()
{
srand(time(NULL))
a=rand();
}
 
for(;;)
{
function_1();
}

위와 같이 처리할 경우에는 a에 같은 값이 연속적으로 들어가 있네요. 이게 왜 그런걸까요.
너무 간단한 질문을 여쭤봐서, 죄송하네요ㅠ
himeggang의 이미지

아마 랜덤이라도 같은 패턴 값이 나오게 되어 있어서 부를때 마다 같은 값이 나온다는 글들을 본적 있습니다.

검색어 치실 필요도 없고 "랜덤함수" 치면 참고하실게 많지 싶어요.

저도 요즘 그럴싸한 랜덤 함수를 찾고 있습니다

palsuet의 이미지

첫 번째 경우에도 1초 단위로 같은 값이 나올텐데요...

어쨌든 srand()는 난수생성기에 seeding하는 함수인데, 여기에 같은 int 값을 넣으면 같은 난수들이 순서대로 발생합니다. time()은 초 단위로 같은 값을 주니까 질문한 코드에서 srand()에는 초 단위로 같은 값이 들어갑니다. 그러니까 0초일 때나 0.5초일 때나 같은 난수가 발생하고, 1초가 지나면 time()이 넘겨주는 값이 1 증가하니까 다른 값이 seeding되면서 다른 난수가 발생합니다.

기본적으로 srand()는 프로그램 내에서 한 번만 실행하면 되니까 첫 번째 예의 경우에는 for 문 전에 한번만 넣고 두 번째 예의 경우에는 main 함수에서 한 번만 실행하면 됩니다.

feel the gravity

jick의 이미지

위에 Palsuet 님도 써주셨지만 srand는 프로그램 전체에서 랜덤 함수를 쓰기 전에 *단 한 번* 랜덤 함수를 초기화하기 위해 부르는 함수고 그 다음에는 계속 rand만 부르는 게 올바른 사용법입니다.

srand를 여러 번 부르면 더 랜덤이 되는 게 아니라 애써서 남들이 열심히 연구해 만들어 놓은 난수 알고리즘의 기본 가정을 깨먹는 상황이 되어서 랜덤함이 더 나빠집니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.