2013-10-11 21 views
6

Tôi đang tạo một ứng dụng bảng điều khiển trò chơi nhỏ. Tôi đã tạo danh sách có 3 câu hỏi trong đó. Làm cách nào để chương trình có thể chọn ngẫu nhiên một câu hỏi và in nó ra khỏi bảng điều khiển?C# Chọn phần tử ngẫu nhiên từ Danh sách

Tôi đã thử một số mã khác nhau nhưng dường như không thể làm cho nó hoạt động vì một số lý do. Đây là mã cuối cùng tôi đã cố gắng, mà tôi nhận được từ người dùng khác từ trang web này, nhưng tôi nhận được lỗi:

"The name 'string' does not exists in current context" 

"Từ 'Quiz.Questions.main()' trả về void, một từ khóa trở lại phải không được theo sau bởi một biểu tượng"

đây là mảnh cuối cùng của mã mà tôi đã cố gắng:

class Questions 
{ 
    public static void main() 
    { 
     var questions = new List<string>{ 
      "question1", 
      "question2", 
      "question3"}; 
     int index = Random.Next(strings.Count); 
     questions.RemoveAt(index); 
     return questions; 

    } 

}

Cảm ơn tất cả các bạn để được trả lời của bạn. Tôi đã khắc phục sự cố của mình bằng cách tạo mảng thay vì Danh sách. Đây là mã của tôi ngay bây giờ:

class Questions 
{ 
    public static void main() 
    { 
     string[] questions = new string[3]; 
     questions[0] = "question1"; 
     questions[1] = "question2"; 
     questions[2] = "question3"; 
     Random rnd = new Random(); 
     Console.WriteLine(questions[rnd.Next(0,2)]); 
    } 
} 
+0

Làm thế nào để bạn gọi phương thức của bạn? Vì hiện tại là loại void, bạn phải bỏ qua giá trị trả về 'câu hỏi ' – HimBromBeere

+3

duplicate => http://stackoverflow.com/questions/2019417/access-random-item-in-list – gleng

+1

var randomQuestion = câu hỏi [ new Random(). Tiếp theo (questions.Count)]; Hãy chắc chắn đầu tiên rằng danh sách không phải là null – iulian3000

Trả lời

4

Bạn cần có System.Console.WriteLine statment.

class Questions 
{ 
    public static void main() 
    { 
     var questions = new List<string>{ 
      "question1", 
      "question2", 
      "question3"}; 
     int index = Random.Next(questions.Count); 
     System.Console.WriteLine(questions[index]); 

    } 
} 
+0

Cũng strings.Count nên được thay thế bằng questions.Count và Random.Next (...) bởi new Random(). Tiếp theo (...). –

+0

Cảm ơn Alexey. Đã sửa. –

+0

@AlexeyMitev: 'new Random(). Tiếp theo' có sự thiếu hụt rằng nó sẽ không tạo ra các số khác nhau nếu nó được gọi nhiều lần trong khoảng thời gian ngắn. –

1

"Cái tên 'string' không tồn tại trong bối cảnh hiện nay"

Tôi giả sử bạn muốn

int index = random.Next(questions.Count); // according to the lower-case random see last paragraph 

thay vì

int index = Random.Next(strings.Count); 

Vì có không có sự biến đổi nào h tên strings và bạn vẫn muốn xóa một câu hỏi.

Ngoài ra, bạn không thể trả lại nội dung nào đó từ phương thức void. Vì vậy, tạo một trả về danh sách:

private Random random = new Random(); 
List<string> GetRemoveQuestion(List<string> questions) 
{ 
     int index = random.Next(questions.Count); 
     questions.RemoveAt(index); 
     return questions; 
} 

Sửa: cuối cùng nhưng không kém, bạn không thể sử dụng Random.Next. Điều đó có thể giả định rằng có một phương pháp staticNext trong Random không phải như vậy. Do đó tôi đã trình bày ở trên cách bạn tạo và sử dụng một cá thể. Lưu ý rằng bạn không nên tạo nó cho chính phương thức đó vì nó được gieo với thời gian curent. Nếu bạn gọi phương thức này rất nhanh, bạn sẽ nhận được cùng một giá trị "ngẫu nhiên" thường xuyên.

Hãy xem msdn at the remarks section để biết thêm chi tiết.

+1

khá chắc chắn Ngẫu nhiên không có phương pháp tĩnh Tiếp theo –

+0

@WeylandYutani: Cảm ơn, đã chỉnh sửa câu trả lời của tôi cho phù hợp. –

11

Bạn có chắc chắn muốn xóa câu hỏi và trả lại các câu hỏi còn lại không? Nếu bạn không chỉ chọn một? Mọi thứ như thế này:

public static void main() 
{ 
    var random = new Random(); 
    var questions = new List<string>{ 
     "question1", 
     "question2", 
     "question3"}; 
    int index = random.Next(questions.Count); 
    Console.WriteLine(questions[index]); 
} 
0

Bạn có một vài lỗi nhỏ.

Bạn cần tham chiếu đến đối tượng Rand.Bạn đang xem strings thay vì questions. Bạn đang xóa một phần tử thay vì chọn nó.

Hãy thử điều này:

void Main() 
{ 
    Random rand = new Random(); 
    var questions = new List<string>{ 
     "question1", 
     "question2", 
     "question3"}; 
    int index = rand.Next(questions.Count); 
    return questions[index]; 
    // If you want to use Linq then 
    // return questions.Skip(index).Take(1); 
} 
0

Something như thế này có thể là những gì bạn muốn:

private Random rng; 
T PickRandom<T>(List<T> list) 
{ 
    return list[rng.NextInt(list.Count)]; 
} 

Bạn có thể gọi nó vào danh sách của bạn để có được một yếu tố ngẫu nhiên từ nó.

3

Hãy thử một cái gì đó như thế này

public static void main() 
{ 
    var questions = new List<string>{ 
     "question1", 
     "question2", 
     "question3"}; 
    Random rnd = new Random(); 
    int index = rnd.Next(questions.Count) 
    string question = questions[index]; 
    questions.RemoveAt(index); // Are you sure you neex to remove? 

    System.Console.WriteLine(question); 
} 

Có một lỗi đánh máy trong nơi bạn đang sử dụng string thay vì questions. Ngoài ra, đối tượng Random cần phải được initalised.

1

Đối với người tìm kiếm khác được hưởng lợi: Nếu bạn muốn có một danh sách cạn kiệt, do đó bạn chắc chắn rằng bạn sử dụng tất cả các mục trong một thời trang ngẫu nhiên sau đó làm điều này:

//use the current time to seed random so it's different every time we run it 
Random rand = new Random(DateTime.Now.ToString().GetHashCode()); 
var list = new List<string>{ "item1", "item2", "item3"}; 

//keep extracting from the list until it's depleted 
while (list.Count > 0) { 
    int index = rand.Next(0, list.Count); 
    Console.WriteLine("Rand Item: " + list[index]); 
    list.RemoveAt(index); 
} 
Các vấn đề liên quan