سؤال

هل من الممكن طباعة رقم عشوائي في C ++ من مجموعة من الأرقام مع عبارة واحدة؟

دعنا نقول المجموعة {2، 5، 22، 55، 332}

بحثت عن راند () لكنني أشك في أنه من الممكن القيام به في بيان واحد.

هل كانت مفيدة؟

المحلول

قل أن هذه الأرقام موجودة في مجموعة من الحجم 5، كل ما عليك فعله هو العثور على قيمة عشوائية مضروبة في 5 (لجعلها quii محتملة). افترض أن الأسلوب RAND () تعيدك قيمة عشوائية بين النطاق من النطاق إلى 1. اضرب نفسه بنسبة 5 وإلقاءها على عدد صحيح، وسوف تحصل على القيم المعززة بين 0 و 4. استخدام ذلك لإحضاره من الفهرس.

أنا لا أعرف بناء الجملة في C ++. ولكن هذا هو كيف ينبغي أن ننظر

my_rand_val = my_set[(int)(rand()*arr_size)]

هنا أفترض أن RAND () هي طريقة ترجع قيمة بين 0 و 1.

نصائح أخرى

int numbers[] = { 2, 5, 22, 55, 332 };
int length = sizeof(numbers) / sizeof(int);
int randomNumber = numbers[rand() % length];

تحول الأمور بلا جدوى إلى تعبير واحد عمليا ما كان مشغل التغرية اخترع ل (أنا لا أواجه أي من الخداع في بيان المركب ل Litb):

std::cout << ((rand()%5==0) ? 2 : 
              (rand()%4==0) ? 5 : 
              (rand()%3==0) ? 22 : 
              (rand()%2==0) ? 55 : 
              332
             ) << std::endl;

من فضلك لا الفئران علي إلى مراجعي التعليمات البرمجية.

آه، هنا نذهب، توزيع موحد مناسب (على افتراض rand() موحدة على نطاقها) في ما يمكنك استدعاء "بيان واحد"، عند تمتد.

إنه بيان تكرار، ولكن بعد ذلك هو حلقة مع كتلة كبيرة كبيرة تحتوي على بيانات متعددة. بناء الجملة لا يميز. هذا يحتوي في الواقع على بيانين: كل شيء هو بيان، والشيء كله باستثناء for(...) الجزء هو بيان. لذلك ربما "بيان واحد" يعني عبارة تعبير واحد، وهذا ليس كذلك. لكن على اي حال:

// weasel #1: #define for brevity. If that's against the rules,
// it can be copy and pasted 7 times below.
#define CHUNK ((((unsigned int)RAND_MAX) + 1) / 5)

// weasel #2: for loop lets me define and use a variable in C++ (not C89)
for (unsigned int n = 5*CHUNK; n >= 5*CHUNK;)
    // weasel #3: sequence point in the ternary operator
    ((n = rand()) < CHUNK) ? std::cout << 2 << "\n" :
             (n < 2*CHUNK) ? std::cout << 5 << "\n" :
             (n < 3*CHUNK) ? std::cout << 22 << "\n" :
             (n < 4*CHUNK) ? std::cout << 55 << "\n" :
             (n < 5*CHUNK) ? std::cout << 332 << "\n" :
             (void)0;
             // weasel #4: retry if we get one of the few biggest values
             // that stop us distributing values evenly between 5 options.

إذا كان هذا سيكون هو الكود الوحيد في البرنامج بأكمله، ولا تريد ذلك لإرجاع نفس القيمة في كل مرة، فأنت بحاجة إلى الاتصال srand(). وبعد لحسن الحظ، يمكن تركيب هذا في. تغيير السطر الأول إلى:

for (unsigned int n = (srand((time(0) % UINT_MAX)), 5*CHUNK); n >= 5*CHUNK;)

الآن، دعونا نتحدث أبدا عن هذا اليوم مرة أخرى.

نعم هذا ممكن. ليس بديهية للغاية ولكن طلبت ذلك:

#include <time.h>
#include <stdlib.h>
#include <iostream>

int main()
{
    srand(time(0));

    int randomNumber = ((int[]) {2, 5, 22, 55, 332})[rand() % 5];

    std::cout << randomNumber << std::endl;

    return 0;
}    

معايير "بيان واحد" غامض للغاية. هل تقصد تعليمات آلة واحدة، مكالمة واحدة stdlib؟

إذا كنت تقصد تعليمات آلة واحدة، فإن الإجابة لا، دون أجهزة خاصة.

إذا كنت تقصد مكالمة وظيفة واحدة، فمن الممكن بالطبع. يمكنك كتابة وظيفة بسيطة لفعل ما تريد:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int setSize = 5;
    int set[] = {2, 5, 22, 55, 332 };
    srand( time(0) );

    int number = rand() % setSize;
    printf("%d %d", number, set[number]);
    return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top